目录

CentOS 上使用 kubeadm 安装 kubernetes

使用 kubeadm 安装 kubernetes 集群。

准备

  • 一台或多台机器,系统可以是 CentOS 7 或者 Red Hat Enterprise Linux (RHEL) 7。
  • 每台机器至少 2 GB RAM
  • 至少 2 核 CPU
  • 所有机器的网络是可以互相连接的
  • 不可以有重复的主机名,MAC 地址或者 product_uuid。Kubernetes 使用这些值来唯一确定集群中的节点。如果不唯一,会导致安装失败。
    • 使用命令 ip linkifconfig -a 来获取网络接口的 MAC 地址
    • 可以使用 sudo cat /sys/class/dmi/id/product_uuid 命令对 product_uuid 校验
  • 为了保证 kubelet 正常工作,必须禁用交换分区。

关闭防火墙:

systemctl stop firewalld
systemctl disable firewalld

将 SELinux 设置为 permissive 模式(相当于将其禁用):

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

关闭 swap:

vim /etc/fstab 注释 swap 那一行:

#
# /etc/fstab
# Created by anaconda on Thu May 28 14:18:10 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=35c960be-191f-4f6a-afb6-e2bf959c4bd4 /boot                   xfs     defaults        0 0
#/dev/mapper/centos-swap swap                    swap    defaults        0 0

安装

安装 runtime

容器 runtime 优先使用 docker。

配置 yum 代理

vim /etc/yum.conf
# 添加行
proxy=<http proxy>

安装依赖包

$ yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

添加 docker yum 软件源

使用官方源:

$ yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

安装 Docker CE

# 更新 yum 软件源缓存
$ yum makecache fast

# 安装 docker-ce
$ yum install -y docker-ce

添加 docker 代理

为 docker 配置代理:

mkdir /etc/systemd/system/docker.service.d
vim /etc/systemd/system/docker.service.d/http-proxy.conf

# 添加下面的内容
[Service]
Environment="HTTP_PROXY=<http proxy>" "NO_PROXY=localhost,127.0.0.1"

# 重新载入 systemd,扫描新的或有变动的单元
systemctl daemon-reload

启动 Docker CE

systemctl enable docker
systemctl start docker

安装 kubeadm

添加 kubernetes 源:

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
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
EOF

安装 kubeadm、kubelet 和 kubectl:

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

systemctl enable --now kubelet

为了解决 iptables 被绕过而导致流量无法正确路由的问题,确保 net.bridge.bridge-nf-call-ip6tablesnet.bridge.bridge-nf-call-iptables 值为 1:

sysctl --system

如果不为 1:

cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

初始化

kubeadm init <args>

输出:

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 16.186.74.208:6443 --token oshoj8.i2up8b5judtojqjl \
    --discovery-token-ca-cert-hash sha256:77d5f9c584b7d1fc4ff7d1e9a61f8b3d29042f8e3bc729cec834a67cb65354bb

根据上面输出中的提示,执行:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

下面的命令用来将 node 添加到集群

kubeadm join 16.186.74.208:6443 --token oshoj8.i2up8b5judtojqjl \
    --discovery-token-ca-cert-hash sha256:77d5f9c584b7d1fc4ff7d1e9a61f8b3d29042f8e3bc729cec834a67cb65354bb

安装网络插件

Calico 是 kubeadm 项目中执行 e2e 测试的唯一 CNI 插件。安装 calico:

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

如果要使用 flannel 作为网络插件,执行 kubeadm init 时使用 --pod-network-cidr 参数。

删除 taints

默认情况下,出于安全原因,集群不会在 master node 上调度 Pod。部署单机 Kubernetes 集群,要运行:

kubectl taint nodes --all node-role.kubernetes.io/master-

输出看起来像:

node "test-01" untainted
taint "node-role.kubernetes.io/master:" not found
taint "node-role.kubernetes.io/master:" not found

Node 的 taint 标记会被删除。

查看集群状态

kubectl cluster-info

kubectl get node

添加节点

在一个新的 node 中以前面的步骤安装 docker,kubeadm,kubelet,kubectl。

然后使用 kubeadm init 输出的命令将 node 加入集群:

kubeadm join 16.186.74.208:6443 --token oshoj8.i2up8b5judtojqjl \
    --discovery-token-ca-cert-hash sha256:77d5f9c584b7d1fc4ff7d1e9a61f8b3d29042f8e3bc729cec834a67cb65354bb

如果没有令牌,可以通过在控制平面节点上运行以下命令来获取令牌:

kubeadm token list

默认情况下,令牌会在 24 小时后过期。如果要在令牌过期后将节点加入集群,运行下面的命令来创建新令牌:

kubeadm token create

如果没有 --discovery-token-ca-cert-hash 的值,使用下面的命令获取

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
   openssl dgst -sha256 -hex | sed 's/^.* //'