安装kubeadm

安装kubeadm

官方文档google翻译
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/

此页面显示了如何安装kubeadm工具箱。有关在执行此安装过程后如何使用kubeadm创建集群的信息,请参阅使用kubeadm创建集群页面。
在你开始之前

一台或多台运行以下其中一项的计算机:
    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正常工作。

验证MAC地址和product_uuid对于每个节点都是唯一的

您可以使用以下命令获得网络接口的MAC地址ip link或ifconfig -a
可以使用以下命令检查product_uuid sudo cat /sys/class/dmi/id/product_uuid

尽管某些虚拟机可能具有相同的值,但是硬件设备很有可能具有唯一的地址。Kubernetes使用这些值来唯一地标识集群中的节点。如果这些值不是每个节点唯一的,则安装过程可能会失败。
检查网络适配器

如果您有多个网络适配器,并且您的Kubernetes组件在默认路由上不可用,我们建议您添加IP路由,以便Kubernetes群集地址通过适当的适配器。
让iptables查看桥接流量

作为您的Linux节点iptables正确查看桥接流量的要求,您应确保net.bridge.bridge-nf-call-iptables在sysctl配置中将其设置为1 ,例如

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

br_netfilter在执行此步骤之前,请确保已加载模块。这可以通过运行来完成lsmod | grep br_netfilter。要显式加载,请调用sudo modprobe br_netfilter。

有关更多详细信息,请参见“ 网络插件要求”页面。
检查所需的端口
控制平面节点
协议 方向 端口范围 目的 使用者
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服务† 所有

† NodePort服务的默认端口范围。

标有*的任何端口号都是可覆盖的,因此您需要确保您提供的任何自定义端口也处于打开状态。

尽管etcd端口包含在控制平面节点中,但是您也可以在外部或自定义端口上托管自己的etcd群集。

您使用的Pod Network插件(请参阅下文)也可能需要打开某些端口。由于每个Pod Network插件的情况不同,因此请参阅插件的文档,以了解所需的端口。
安装运行时

为了在Pods中运行容器,Kubernetes使用 容器运行时 。

Linux节点
其他操作系统

默认情况下,Kubernetes使用 容器运行时界面 (CRI)与您选择的容器运行时交互。

如果您未指定运行时,则kubeadm会通过扫描众所周知的Unix域套接字列表自动尝试检测已安装的容器运行时。下表列出了容器运行时及其关联的套接字路径:
运行 Unix域套接字的路径
码头工人 /var/run/docker.sock
装箱的 /run/containerd/containerd.sock
CRI-O /var/run/crio/crio.sock

如果同时检测到Docker和containerd,则Docker优先。这是必需的,因为Docker 18.09附带了容器,并且即使仅安装了Docker,也可以检测到两者。如果检测到其他两个或更多运行时,则kubeadm退出并显示错误。

kubelet通过内置的dockershimCRI实现与Docker集成。

有关 更多信息,请参见容器运行时。

默认情况下,kubeadm使用 码头工人作为容器运行时。kubelet通过内置的dockershimCRI实现与Docker集成。

有关 更多信息,请参见容器运行时。
安装kubeadm,kubelet和kubectl

您将在所有计算机上安装以下软件包:

kubeadm:引导集群的命令。

kubelet:在集群中所有计算机上运行的组件,它执行诸如启动Pod和容器之类的操作。

kubectl:与您的集群通信的命令行工具。

kubeadm 不会安装或管理kubelet或kubectl对你,所以你需要确保他们想要kubeadm安装适合你的Kubernetes控制平面的版本匹配。如果您不这样做,则存在发生版本偏斜的风险,这可能导致意外的,错误的行为。但是,支持kubelet和控制平面之间的一个次要版本偏斜,但是kubelet版本不得超过API服务器版本。例如,运行1.7.0的kubelet应该与1.8.0 API服务器完全兼容,反之亦然。

有关安装的信息kubectl,请参阅安装和设置kubectl。

警告:这些说明从所有系统升级中排除了所有Kubernetes软件包。这是因为kubeadm和Kubernetes需要 特别注意进行升级。

有关版本偏斜的更多信息,请参见:

Kubernetes 版本和版本偏斜政策
特定于Kubeadm的版本倾斜政策

Ubuntu,Debian或HypriotOS
CentOS,RHEL或Fedora
Fedora CoreOS

sudo apt-get update && sudo apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF

Set SELinux in permissive mode (effectively disabling it)

sudo setenforce 0
sudo sed -i ‘s/^SELINUX=enforcing$/SELINUX=permissive/‘ /etc/selinux/config

sudo yum install -y kubelet kubeadm kubectl —disableexcludes=kubernetes

sudo systemctl enable —now kubelet

笔记:

通过运行setenforce 0并sed ...有效禁用SELinux,将其设置为许可模式。这是允许容器访问主机文件系统所必需的,例如Pod网络所需要的。您必须执行此操作,直到kubelet中的SELinux支持得到改善。

如果您知道如何配置SELinux,则可以将其保持启用状态,但是它可能需要kubeadm不支持的设置。

安装CNI插件(大多数Pod网络需要):

CNI_VERSION=”v0.8.2”
sudo mkdir -p /opt/cni/bin
curl -L “https://github.com/containernetworking/plugins/releases/download/${CNI_VERSION}/cni-plugins-linux-amd64-${CNI_VERSION}.tgz“ | sudo tar -C /opt/cni/bin -xz

定义目录以下载命令文件

DOWNLOAD_DIR=/usr/local/bin
sudo mkdir -p $DOWNLOAD_DIR

安装crictl(kubeadm / Kubelet容器运行时接口(CRI)所需)

CRICTL_VERSION=”v1.17.0”
curl -L “https://github.com/kubernetes-sigs/cri-tools/releases/download/${CRICTL_VERSION}/crictl-${CRICTL_VERSION}-linux-amd64.tar.gz“ | sudo tar -C $DOWNLOAD_DIR -xz

安装kubeadm,kubelet,kubectl并添加一个kubeletsystemd服务:

RELEASE=”$(curl -sSL https://dl.k8s.io/release/stable.txt)”
cd $DOWNLOAD_DIR
sudo curl -L —remote-name-all https://storage.googleapis.com/kubernetes-release/release/${RELEASE}/bin/linux/amd64/{kubeadm,kubelet,kubectl}
sudo chmod +x {kubeadm,kubelet,kubectl}

RELEASE_VERSION=”v0.2.7”
curl -sSL “https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/kubepkg/templates/latest/deb/kubelet/lib/systemd/system/kubelet.service“ | 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 “https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/kubepkg/templates/latest/deb/kubeadm/10-kubeadm.conf“ | sed “s:/usr/bin:${DOWNLOAD_DIR}:g” | sudo tee /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

启用并开始kubelet:

systemctl enable —now kubelet

现在,kubelet每隔几秒钟重新启动一次,因为它在崩溃循环中等待kubeadm告诉它该怎么做。
在控制平面节点上配置kubelet使用的cgroup驱动程序

使用Docker时,kubeadm将自动检测kubelet的cgroup驱动程序并/var/lib/kubelet/config.yaml在运行时将其设置在文件中。

如果使用其他CRI,则必须使用您的cgroupDriver值修改文件,如下所示:

apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: <value>

请注意,只有在CRI的cgroup驱动程序不是cgroupfs的情况下,才需要这样做,因为这已经是kubelet中的默认值。

注意:由于--cgroup-driverkubelet已弃用该标志,因此,如果在/var/lib/kubelet/kubeadm-flags.env或/etc/default/kubelet(/etc/sysconfig/kubelet对于RPM)中具有该标志,请删除它并改用KubeletConfiguration(/var/lib/kubelet/config.yaml默认存储在)中。

需要重新启动kubelet:

systemctl daemon-reload
systemctl restart kubelet

正在为其他容器运行时(如CRI-O和容器化)自动检测cgroup驱动程序。