雅云 kubernetes
准备环境
- 操作系统:OpenEuler 24.03 LTS
- kubernetes 版本:v1.31.3
- 参考
部署
系统准备(以下默认以root用户执行)
- 配置sysctl
启用桥接网络上的IPv6和IPv4流量通过iptables进行过滤,并启动IP转发,运行内核转发IPv4包,确保跨界点的Pod间通信:
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness=0
EOF
modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf
-
配置防火墙,有两种方式:
- 开放etcd和API Server端口(根据实际开放端口配置):
firewall-cmd --zone=public --add-port=2379/tcp --permanent # etcd firewall-cmd --zone=public --add-port=2380/tcp --permanent # etcd firewall-cmd --zone=public --add-port=6443/tcp --permanent # kube-apiserver firewall-cmd --reload
- 直接关闭防火墙
systemctl stop firewalld systemctl disable firewalld
-
禁用swap
Kubernetes的资源调度器根据节点的可用内存和CPU资源来决定将哪些Pod分配到哪些节点上。如果节点上启用了swap,实际可用的物理内存和逻辑上可用的内存可能不一致,这会影响调度器的决策,导致某些节点出现过载,或者在某些情况下调度错误。因此需要禁用swap:
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
- 禁用SELinux
SELinux的安全策略可能会阻止容器内的某些操作,比如写入特定目录、访问网络资源、或执行具有特权的操作。这会导致 CoreDNS 等关键服务无法正常运行,并表现为CrashLoopBackOff或 Error状态。可以使用以下命令来禁用SELinux:
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
安装kubeXXX,containerd
- 添加Kubernetes源(使用清华源),安装kubeXXX
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.tuna.tsinghua.edu.cn/kubernetes/core:/stable:/v1.31/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.tuna.tsinghua.edu.cn/kubernetes/core:/stable:/v1.31/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
# 刷新源缓存
dnf clean all && dnf makecache
dnf install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
- 安装并配置
containerd
dnf makecache # 更新源缓存
dnf install -y containerd # 当前版本为:1.6.22
设置pause_image、cgroup驱动、关闭"registry.k8s.io"镜像源证书验证、配置代理
# 生成containerd的默认配置文件
containerd_conf="/etc/containerd/config.toml"
mkdir -p /etc/containerd
containerd config default > "${containerd_conf}"
# 配置pause_image
pause_img=$(kubeadm config images list | grep pause | tail -1)
sed -i "/sandbox_image/s#\".*\"#\"${pause_img}\"#" "${containerd_conf}"
# 将cgroup驱动指定为systemd
sed -i "/SystemdCgroup/s/=.*/= true/" "${containerd_conf}"
# 将cgroup驱动指定为systemd
sed -i '/plugins."io.containerd.grpc.v1.cri".registry.configs/a\[plugins."io.containerd.grpc.v1.cri".registry.configs."registry.k8s.io".tls]\n insecure_skip_verify = true' /etc/containerd/config.toml
# 配置代理(if neccessary)
server_path="/etc/systemd/system/containerd.service.d"
mkdir -p "${server_path}"
cat > "${server_path}"/http-proxy.conf << EOF
[Service]
Environment="HTTP_PROXY=***"
Environment="HTTPS_PROXY=***"
Environment="NO_PROXY=***"
EOF
启动并启用containerd服务:
systemctl daemon-reload
systemctl enable containerd
systemctl start containerd
- 使用flannel插件
mkdir -p /opt/cni/bin && wget --no-check-certificate -O /tmp/cni.tgz https://mirrors.yacloud.net/k8s/cni-plugins-linux-amd64-v1.6.1.tgz && tar -xzvf /tmp/cni.tgz -C /opt/cni/bin
wget -O /opt/cni/kube-flannel.yml https://mirrors.yacloud.net/k8s/kube-flannel.yml
其他配置
- 配置crictl使用containerd作为容器运行时
crictl config runtime-endpoint unix:///run/containerd/containerd.sock
crictl config image-endpoint unix:///run/containerd/containerd.sock
- 配置kubelet使用systemd作为cgroup驱动
systemctl enable kubelet.service
echo 'KUBELET_EXTRA_ARGS="--runtime-cgroups=/systemd/system.slice --kubelet-cgroups=/systemd/system.slice"' >> /etc/sysconfig/kubelet
systemctl restart kubelet
使用kubeadm创建集群(控制平面节点 Control Plane Nodes)
- 创建配置文件
mkdir -p ~/.kube
$ kubeadm config print init-defaults --component-configs KubeletConfiguration >> ~/.kube/kubeletConfig.yaml
- 编辑kubeletConfig.yaml,需要修改以下几个关键字段:
localAPIEndpoint:
advertiseAddress: "系统实际可用的地址"
nodeRegistration:
name: "节点名称,与hostname一致"
networking:
podSubnet: "podSubnet指定CIDR范围,例如:10.244.10.10/16"
- 部署集群
# 如果有代理,关闭代理
unset http_proxy https_proxy
# 初始化
kubeadm init --config ~/.kube/kubeletConfig.yaml
# 指定kubectl使用的配置文件
mkdir -p "$HOME"/.kube
cp -i /etc/kubernetes/admin.conf "$HOME"/.kube/config
chown "$(id -u)":"$(id -g)" "$HOME"/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
- 重置集群
kubeadm reset
加入集群(工作节点 Worker Nodes)
工作节点需要先安装好kubelet、containerd等组件,其配置与control plane节点相同,也要禁用SELinux、Swap等。
Control Plane 初始化成功后,会生成kubeadm join命令,需要将此命令复制到其他节点上执行,完成集群的加入。
例如:
kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
--token
为集群初始化时生成的token,可再次生成:
kubeadm token create
--discovery-token-ca-cert-hash sha256:<hash>
中的hash可通过以下命令查看:
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
更多关于token可使用kubeadm token
命令查看。