雅云 kubernetes

准备环境

部署

系统准备(以下默认以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
  • 配置防火墙,有两种方式:

    1. 开放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
    1. 直接关闭防火墙
    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)

  1. 创建配置文件
mkdir -p ~/.kube
$ kubeadm config print init-defaults --component-configs KubeletConfiguration >> ~/.kube/kubeletConfig.yaml
  1. 编辑kubeletConfig.yaml,需要修改以下几个关键字段:
localAPIEndpoint:
  advertiseAddress: "系统实际可用的地址"

nodeRegistration:
  name: "节点名称,与hostname一致"

networking:
  podSubnet: "podSubnet指定CIDR范围,例如:10.244.10.10/16"
  1. 部署集群
# 如果有代理,关闭代理
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
  1. 重置集群
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命令查看。