CentOS 上使用 kubeadm 安装 kubernetes
使用 kubeadm 安装 kubernetes 集群。
准备
- 一台或多台机器,系统可以是 CentOS 7 或者 Red Hat Enterprise Linux (RHEL) 7。
- 每台机器至少 2 GB RAM
- 至少 2 核 CPU
- 所有机器的网络是可以互相连接的
- 不可以有重复的主机名,MAC 地址或者
product_uuid
。Kubernetes 使用这些值来唯一确定集群中的节点。如果不唯一,会导致安装失败。- 使用命令
ip link
或ifconfig -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-ip6tables
和 net.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/^.* //'