安装kubeadm
<p>安装kubeadm</p>
<p>官方文档google翻译
<a href="https://translate.google.com/translate?depth=1&hl=zh-CN&rurl=translate.google.com&sl=en&tl=zh&u=https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/">https://translate.google.com/translate?depth=1&hl=zh-CN&rurl=translate.google.com&sl=en&tl=zh&u=https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/</a></p>
<p>此页面显示了如何安装kubeadm工具箱。有关在执行此安装过程后如何使用kubeadm创建集群的信息,请参阅使用kubeadm创建集群页面。
在你开始之前</p>
<pre><code>一台或多台运行以下其中一项的计算机:
Ubuntu 16.04以上
Debian 9+
CentOS的7
红帽企业Linux(RHEL)7
Fedora 25+
HypriotOS v1.0.1 +
容器Linux(已通过1800.6.0测试)
每台计算机2 GB或更多的RAM(更少的空间将为您的应用程序留出很少的空间)
2个或更多CPU
群集中所有计算机之间的完整网络连接(可以使用公用或专用网络)
每个节点的唯一主机名,MAC地址和product_uuid。有关更多详细信息,请参见此处。
某些端口在您的计算机上打开。有关更多详细信息,请参见此处。
交换已禁用。您必须禁用交换才能使kubelet正常工作。</code></pre>
<p>验证MAC地址和product_uuid对于每个节点都是唯一的</p>
<pre><code>您可以使用以下命令获得网络接口的MAC地址ip link或ifconfig -a
可以使用以下命令检查product_uuid sudo cat /sys/class/dmi/id/product_uuid</code></pre>
<p>尽管某些虚拟机可能具有相同的值,但是硬件设备很有可能具有唯一的地址。Kubernetes使用这些值来唯一地标识集群中的节点。如果这些值不是每个节点唯一的,则安装过程可能会失败。
检查网络适配器</p>
<p>如果您有多个网络适配器,并且您的Kubernetes组件在默认路由上不可用,我们建议您添加IP路由,以便Kubernetes群集地址通过适当的适配器。
让iptables查看桥接流量</p>
<p>作为您的Linux节点iptables正确查看桥接流量的要求,您应确保net.bridge.bridge-nf-call-iptables在sysctl配置中将其设置为1 ,例如</p>
<p>cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system</p>
<p>br_netfilter在执行此步骤之前,请确保已加载模块。这可以通过运行来完成lsmod | grep br_netfilter。要显式加载,请调用sudo modprobe br_netfilter。</p>
<p>有关更多详细信息,请参见“ 网络插件要求”页面。
检查所需的端口
控制平面节点
协议 方向 端口范围 目的 使用者
TCP协议 入站 6443 * Kubernetes API服务器 所有
TCP协议 入站 2379-2380 etcd服务器客户端API kube-apiserver等
TCP协议 入站 10250 Kubelet API 自控平面
TCP协议 入站 10251 库伯调度器 自
TCP协议 入站 10252 kube-controller-manager 自
工作节点
协议 方向 端口范围 目的 使用者
TCP协议 入站 10250 Kubelet API 自控平面
TCP协议 入站 30000-32767 NodePort服务† 所有</p>
<p>† NodePort服务的默认端口范围。</p>
<p>标有*的任何端口号都是可覆盖的,因此您需要确保您提供的任何自定义端口也处于打开状态。</p>
<p>尽管etcd端口包含在控制平面节点中,但是您也可以在外部或自定义端口上托管自己的etcd群集。</p>
<p>您使用的Pod Network插件(请参阅下文)也可能需要打开某些端口。由于每个Pod Network插件的情况不同,因此请参阅插件的文档,以了解所需的端口。
安装运行时</p>
<p>为了在Pods中运行容器,Kubernetes使用 容器运行时 。</p>
<pre><code>Linux节点
其他操作系统</code></pre>
<p>默认情况下,Kubernetes使用 容器运行时界面 (CRI)与您选择的容器运行时交互。</p>
<p>如果您未指定运行时,则kubeadm会通过扫描众所周知的Unix域套接字列表自动尝试检测已安装的容器运行时。下表列出了容器运行时及其关联的套接字路径:
运行 Unix域套接字的路径
码头工人 /var/run/docker.sock
装箱的 /run/containerd/containerd.sock
CRI-O /var/run/crio/crio.sock</p>
<p>如果同时检测到Docker和containerd,则Docker优先。这是必需的,因为Docker 18.09附带了容器,并且即使仅安装了Docker,也可以检测到两者。如果检测到其他两个或更多运行时,则kubeadm退出并显示错误。</p>
<p>kubelet通过内置的dockershimCRI实现与Docker集成。</p>
<p>有关 更多信息,请参见容器运行时。</p>
<p>默认情况下,kubeadm使用 码头工人作为容器运行时。kubelet通过内置的dockershimCRI实现与Docker集成。</p>
<p>有关 更多信息,请参见容器运行时。
安装kubeadm,kubelet和kubectl</p>
<p>您将在所有计算机上安装以下软件包:</p>
<pre><code>kubeadm:引导集群的命令。
kubelet:在集群中所有计算机上运行的组件,它执行诸如启动Pod和容器之类的操作。
kubectl:与您的集群通信的命令行工具。</code></pre>
<p>kubeadm 不会安装或管理kubelet或kubectl对你,所以你需要确保他们想要kubeadm安装适合你的Kubernetes控制平面的版本匹配。如果您不这样做,则存在发生版本偏斜的风险,这可能导致意外的,错误的行为。但是,支持kubelet和控制平面之间的一个次要版本偏斜,但是kubelet版本不得超过API服务器版本。例如,运行1.7.0的kubelet应该与1.8.0 API服务器完全兼容,反之亦然。</p>
<p>有关安装的信息kubectl,请参阅安装和设置kubectl。</p>
<pre><code>警告:这些说明从所有系统升级中排除了所有Kubernetes软件包。这是因为kubeadm和Kubernetes需要 特别注意进行升级。</code></pre>
<p>有关版本偏斜的更多信息,请参见:</p>
<pre><code>Kubernetes 版本和版本偏斜政策
特定于Kubeadm的版本倾斜政策
Ubuntu,Debian或HypriotOS
CentOS,RHEL或Fedora
Fedora CoreOS</code></pre>
<p>sudo apt-get update && sudo apt-get install -y apt-transport-https curl
curl -s <a href="https://packages.cloud.google.com/apt/doc/apt-key.gpg">https://packages.cloud.google.com/apt/doc/apt-key.gpg</a> | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb <a href="https://apt.kubernetes.io/">https://apt.kubernetes.io/</a> kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl</p>
<p>cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=<a href="https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch">https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch</a>
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=<a href="https://packages.cloud.google.com/yum/doc/yum-key.gpg">https://packages.cloud.google.com/yum/doc/yum-key.gpg</a> <a href="https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg">https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg</a>
exclude=kubelet kubeadm kubectl
EOF</p>
<h1>Set SELinux in permissive mode (effectively disabling it)</h1>
<p>sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config</p>
<p>sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes</p>
<p>sudo systemctl enable --now kubelet</p>
<p>笔记:</p>
<pre><code>通过运行setenforce 0并sed ...有效禁用SELinux,将其设置为许可模式。这是允许容器访问主机文件系统所必需的,例如Pod网络所需要的。您必须执行此操作,直到kubelet中的SELinux支持得到改善。
如果您知道如何配置SELinux,则可以将其保持启用状态,但是它可能需要kubeadm不支持的设置。</code></pre>
<p>安装CNI插件(大多数Pod网络需要):</p>
<p>CNI_VERSION="v0.8.2"
sudo mkdir -p /opt/cni/bin
curl -L "<a href="https://github.com/containernetworking/plugins/releases/download/${CNI_VERSION}/cni-plugins-linux-amd64-${CNI_VERSION}.tgz">https://github.com/containernetworking/plugins/releases/download/${CNI_VERSION}/cni-plugins-linux-amd64-${CNI_VERSION}.tgz</a>" | sudo tar -C /opt/cni/bin -xz</p>
<p>定义目录以下载命令文件</p>
<p>DOWNLOAD_DIR=/usr/local/bin
sudo mkdir -p $DOWNLOAD_DIR</p>
<p>安装crictl(kubeadm / Kubelet容器运行时接口(CRI)所需)</p>
<p>CRICTL_VERSION="v1.17.0"
curl -L "<a href="https://github.com/kubernetes-sigs/cri-tools/releases/download/${CRICTL_VERSION}/crictl-${CRICTL_VERSION}-linux-amd64.tar.gz">https://github.com/kubernetes-sigs/cri-tools/releases/download/${CRICTL_VERSION}/crictl-${CRICTL_VERSION}-linux-amd64.tar.gz</a>" | sudo tar -C $DOWNLOAD_DIR -xz</p>
<p>安装kubeadm,kubelet,kubectl并添加一个kubeletsystemd服务:</p>
<p>RELEASE="$(curl -sSL <a href="https://dl.k8s.io/release/stable.txt">https://dl.k8s.io/release/stable.txt</a>)"
cd $DOWNLOAD_DIR
sudo curl -L --remote-name-all <a href="https://storage.googleapis.com/kubernetes-release/release/${RELEASE}/bin/linux/amd64/{kubeadm,kubelet,kubectl">https://storage.googleapis.com/kubernetes-release/release/${RELEASE}/bin/linux/amd64/{kubeadm,kubelet,kubectl</a>}
sudo chmod +x {kubeadm,kubelet,kubectl}</p>
<p>RELEASE_VERSION="v0.2.7"
curl -sSL "<a href="https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/kubepkg/templates/latest/deb/kubelet/lib/systemd/system/kubelet.service">https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/kubepkg/templates/latest/deb/kubelet/lib/systemd/system/kubelet.service</a>" | sed "s:/usr/bin:${DOWNLOAD_DIR}:g" | sudo tee /etc/systemd/system/kubelet.service
sudo mkdir -p /etc/systemd/system/kubelet.service.d
curl -sSL "<a href="https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/kubepkg/templates/latest/deb/kubeadm/10-kubeadm.conf">https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/kubepkg/templates/latest/deb/kubeadm/10-kubeadm.conf</a>" | sed "s:/usr/bin:${DOWNLOAD_DIR}:g" | sudo tee /etc/systemd/system/kubelet.service.d/10-kubeadm.conf</p>
<p>启用并开始kubelet:</p>
<p>systemctl enable --now kubelet</p>
<p>现在,kubelet每隔几秒钟重新启动一次,因为它在崩溃循环中等待kubeadm告诉它该怎么做。
在控制平面节点上配置kubelet使用的cgroup驱动程序</p>
<p>使用Docker时,kubeadm将自动检测kubelet的cgroup驱动程序并/var/lib/kubelet/config.yaml在运行时将其设置在文件中。</p>
<p>如果使用其他CRI,则必须使用您的cgroupDriver值修改文件,如下所示:</p>
<p>apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: <value></p>
<p>请注意,只有在CRI的cgroup驱动程序不是cgroupfs的情况下,才需要这样做,因为这已经是kubelet中的默认值。</p>
<pre><code>注意:由于--cgroup-driverkubelet已弃用该标志,因此,如果在/var/lib/kubelet/kubeadm-flags.env或/etc/default/kubelet(/etc/sysconfig/kubelet对于RPM)中具有该标志,请删除它并改用KubeletConfiguration(/var/lib/kubelet/config.yaml默认存储在)中。</code></pre>
<p>需要重新启动kubelet:</p>
<p>systemctl daemon-reload
systemctl restart kubelet</p>
<p>正在为其他容器运行时(如CRI-O和容器化)自动检测cgroup驱动程序。</p>