准备开始
一台或多台运行兼容 deb/rpm 的 Linux 操作系统的计算机;例如:Ubuntu 或 CentOS。
每台机器 2 GB 以上的内存,内存不足时应用会受限制。
用作控制平面节点的计算机上至少有2个 CPU。
集群中所有计算机之间具有完全的网络连接。你可以使用公共网络或专用网络。
目标
安装单个控制平面的 Kubernetes 集群
在集群上安装 Pod 网络,以便你的 Pod 可以相互连通操作指南
节点
设置节点名称
hostnamectl set-hostname master01
hostnamectl set-hostname worker01
hostnamectl set-hostname worker02
hostnamectl set-hostname worker03
vim /etc/hosts
172.17.111.80 master01
172.17.111.81 worker01
172.17.111.82 worker02
172.17.111.83 worker03
关闭selinux
setenforce 0
sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config
# 请注意:
通过运行命令 setenforce 0 和 sed ... 将 SELinux 设置为 permissive 模式 可以有效地将其禁用。 这是允许容器访问主机文件系统所必需的,而这些操作时为了例如 Pod 网络工作正常。
你必须这么做,直到 kubelet 做出对 SELinux 的支持进行升级为止。
如果你知道如何配置 SELinux 则可以将其保持启用状态,但可能需要设定 kubeadm 不支持的部分配置
关闭swap
swapoff -a && free –h
关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
同步服务器时间
yum install chrony -y
systemctl enable chronyd
systemctl start chronyd
chronyc sources
设置iptables规则
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT
containerd
安装和配置的先决条件
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 设置必需的 sysctl 参数,这些参数在重新启动后仍然存在。
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
vm.swappiness = 0
EOF
sysctl -p /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-arptables:是否在 arptables 的 FORWARD 中过滤网桥的 ARP 包
net.bridge.bridge-nf-call-ip6tables:是否在 ip6tables 链中过滤 IPv6 包
net.bridge.bridge-nf-call-iptables:是否在 iptables 链中过滤 IPv4 包
net.bridge.bridge-nf-filter-vlan-tagged:是否在 iptables/arptables 中过滤打了 vlan 标签的包。
作者:凉风有信llm
链接:https://www.jianshu.com/p/812cf86f7e2a
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
# 应用 sysctl 参数而无需重新启动
sysctl -p /etc/sysctl.d/99-kubernetes-cri.conf
安装 containerd
# 从官方Docker仓库安装 containerd.io 软件包
yum -y install yum-utils
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y containerd.io
# 配置 containerd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sed -i "s#k8s.gcr.io#registry.cn-hangzhou.aliyuncs.com/google_containers#g" /etc/containerd/config.toml
sed -i '/containerd.runtimes.runc.options/a\ \ \ \ \ \ \ \ \ \ \ \ SystemdCgroup = true' /etc/containerd/config.toml
sed -i "s#https://registry-1.docker.io#https://registry.cn-hangzhou.aliyuncs.com#g" /etc/containerd/config.toml
# 重新启动 containerd
systemctl daemon-reload
systemctl enable containerd && systemctl restart containerd
安装 kubeadm、kubelet 和 kubectl
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
# 设置运行时
crictl config runtime-endpoint /run/containerd/containerd.sock
systemctl daemon-reload
systemctl enable kubelet && systemctl start kubelet
# 请注意
kubelet 现在每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环
配置 kubelet 的 cgroup 驱动
kubeadm 支持在执行 kubeadm init 时,传递一个 KubeletConfiguration 结构体。 KubeletConfiguration 包含 cgroupDriver 字段,可用于控制 kubelet 的 cgroup 驱动。
在版本 1.22 中,如果用户没有在 KubeletConfiguration 中设置 cgroupDriver 字段, kubeadm init 会将它设置为默认值 systemd。
# 最小化的示例
# kubeadm-config.yaml
kind: ClusterConfiguration
apiVersion: kubeadm.k8s.io/v1beta3
kubernetesVersion: v1.21.0
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd
始化控制平面节点
kubeadm初始化
kubeadm config print init-defaults > ./kubeadm.yaml
修改kubeadm.yaml文件
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 172.17.111.80 #修改ip(内网ip)
bindPort: 6443
nodeRegistration:
criSocket: /run/containerd/containerd.sock #运行时域套接字
imagePullPolicy: IfNotPresent
name: master01 #节点名称
taints: null
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kub:wqernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers #改成阿里云镜像地址
kind: ClusterConfiguration
kubernetesVersion: 1.23.0
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16 #Pod网段, flannel插件需要使用这个网段
serviceSubnet: 10.96.0.0/12
scheduler: {}
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd
kubeadm config images list --config kubeadm.yaml
kubeadm config images pull --config kubeadm.yaml
kubeadm init --config kubeadm.yaml
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
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
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 172.17.111.80:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:fb14f0ff9d1a2b444edd369798f5e9aa71bc5c2c581d12aaeb89f19a5d0a41a6
配置kubectl
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
或者
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile
加入工作节点
节点是你的工作负载(容器和 Pod 等)运行的地方。要将新节点添加到集群,请对每台计算机执行以下操作:
SSH 到机器
成为 root (例如 sudo su -)
运行 kubeadm init 输出的命令。例如:
kubeadm join --token <token> <control-plane-host>:<control-plane-port> --discovery-token-ca-cert-hash sha256:<hash>
如果没有令牌,可以通过在控制平面节点上运行以下命令来获取令牌:
kubeadm token list
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
abcdef.0123456789abcdef 23h 2022-03-21T10:47:33Z authentication,signing <none> system:bootstrappers:kubeadm:default-node-token
默认情况下,令牌会在24小时后过期。如果要在当前令牌过期后将节点加入集群, 则可以通过在控制平面节点上运行以下命令来创建新令牌:
kubeadm token create
q12sfu.0mejskfdz9be5umo
如果你没有 --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/^.* //'
fb14f0ff9d1a2b444edd369798f5e9aa71bc5c2c581d12aaeb89f19a5d0a41a6
加入工作节点
kubeadm join 172.17.111.80:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:fb14f0ff9d1a2b444edd369798f5e9aa71bc5c2c581d12aaeb89f19a5d0a41a6
重新平衡 CoreDNS Pods(可选)
由于集群节点通常是按顺序初始化的,CoreDNS Pods 很可能都运行在第一个控制面节点上。 为了提供更高的可用性,请在加入至少一个新节点后 使用
kubectl -n kube-system rollout restart deployment coredns
命令,重新平衡 CoreDNS Pods。
flannel
wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml
查看集群状态
kubectl get nodes
NAME STATUS ROLES AGE VERSION
master01 Ready control-plane,master 112m v1.23.5
worker01 Ready <none> 111m v1.23.5
worker02 Ready <none> 111m v1.23.5
worker03 Ready <none> 73m v1.23.5
集群中节点重启后,无法正常工作
查看swapp分区
free -h
total used free shared buff/cache available
Mem: 2.6G 216M 2.1G 9.6M 247M 2.2G
Swap: 2.0G 0B 2.0G
关闭swap分区,稍等几分钟集群就正常了
swapoff -a
永久禁用,需要在swapoff -a之后,执行以下命令,重启集群节点正常
sed -i.bak '/swap/s/^/#/' /etc/fstab
kubectl get nodes
NAME STATUS ROLES AGE VERSION
master01 Ready control-plane,master 5h29m v1.23.5
worker01 Ready <none> 5h29m v1.23.5
worker02 Ready <none> 5h29m v1.23.5
worker03 Ready <none> 4h51m v1.23.5