Skip to content

Centos国内安装Kubernetes

安装前准备

  1. Set SELinux in permissive mode (effectively disabling it)
sh
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
  1. 设置Centos kuberneets yum源
sh
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
  1. 机器最少2个CPU,内存最少2G, 保证端口6443打开,用于内部机器互通

  2. 关闭swap分区

查看swap分区

sh
free -h

临时关闭swap分区

sh
sudo swapoff -a

永久关闭需要查看 /etc/fstab,注释swap分区所在行

安装kubernetes

bash
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
# 安装containerd.io
sudo yum install -y containerd.io
# 放入开机启动并打开kubelet
sudo systemctl enable --now kubelet

--disableexcludes=kubernetes意味着你要禁用名为 "kubernetes" 的软件包组的排除规则。这通常用于确保你能够安装指定软件包组的所有组件,而不会受到其他排除规则的影响。

在 Kubernetes 的上下文中,安装 kubelet、kubeadm 和 kubectl 这三个软件包时,可能涉及到依赖关系和软件包组。使用 --disableexcludes=kubernetes 可以确保这三个软件包以及它们的依赖能够正确地被安装,即使存在其他排除规则。

初始化 kubernetes

使用 flannel network组件需要保证pod的网络是 10.244.0.0/16, 如果你自定义pod网络地址,请参照 github flannel

如果只安装一台机器,可以设置 --control-plane-endpoint=127.0.0.1, 这样可以不需要关闭防火墙, 另外有些机器的网卡没有内网,直接设置外网IP更适合这种方式。

bash
kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository=registry.aliyuncs.com/google_containers

添加flannel网络

bash
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

crictlctr使用同样的 containerd 运行时

ctr是containerd CLI, 我们安装的是 containerd, 所以使用这个命令可以查看运行了哪些container, 类似于docker
crictl是CRI的客户端, 全称container runtime interface, 定义的是容器与kubernetes之间的通信和交互的标准接口

将下面的代码放到 .bashrc中

bash
export CONTAINER_RUNTIME_ENDPOINT=unix:///run/containerd/containerd.sock
export CONTAINERD_ADDRESS=/run/containerd/containerd.sock

ctr 有namespace的概念,默认是 default

bash
# 查看namespace列表
ctr ns ls

# 查看 ns=k8s.io的container
ctr -n k8s.io containers ls

阿里云镜像加速

当你的镜像放在阿里云,可以使用这个加速拉取镜像

bash
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://qudne51i.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

貌似已经不能用了,可以用下面的

cat >/etc/docker/daemon.json<<-'EOF'
{
  "registry-mirrors": [
    "https://mirror.gcr.io",
    "https://docker.registry.cyou",
    "https://docker-cf.registry.cyou",
    "https://dockercf.jsdelivr.fyi",
    "https://docker.jsdelivr.fyi",
    "https://dockertest.jsdelivr.fyi",
    "https://mirror.aliyuncs.com",
    "https://dockerproxy.com",
    "https://mirror.baidubce.com",
    "https://docker.m.daocloud.io",
    "https://docker.nju.edu.cn",
    "https://docker.mirrors.sjtug.sjtu.edu.cn"
  ]
}
EOF

参考 https://blog.csdn.net/weixin_43837718/article/details/141263657

安装碰到最坑的几点

  • 磁盘容量太小,导致一直触发自动删除镜像,每次kubeadm init 都要重新到网络上获取一遍,浪费很长时间去尝试安装

  • 安装完成后 node节点自动添加了一个无法删除的taint(污点) node.kubernetes.io/disk-pressure:NoSchedule 这种情况需要每个目录去查看哪些文件太大,然后将其清理掉

  • 镜像 registry.k8s.io/pause:3.6 不兼容当前的kubernetes版本,被推荐需要使用3.9版本, 但是这个版本会在每次拉取镜像时都触发,阻碍了镜像拉取, 而且不受--image-repository参数的控制

  • kubelet[20643]: E1214 12:32:08.038923 20643 run.go:74] "command failed" err="failed to run Kubelet: validate service connection: validate CRI v1 runtime API for endpoint "unix:///run/containerd/containerd.sock": rpc error: code = Unimplemented desc = unknown service runtime.v1.RuntimeService"

如果使用的是 containerd, 找到文件 /etc/containerd/config.toml 注释掉下面这一段

bash
# disabled_plugins = ["cri"]
  • Failed to create pod sandbox: rpc error: code = DeadlineExceeded desc = failed to get sandbox image "registry.k8s.io/pause:3.6": failed to pull image "registry.k8s.io/pause:3.6": failed to pull and unpack image "registry.k8s.io/pause:3.6": failed to resolve reference "registry.k8s.io/pause:3.6": failed to do request: Head "https://us-west2-docker.pkg.dev/v2/k8s-artifacts-prod/images/pause/manifests/3.6": dial tcp 64.233.189.82:443: i/o timeout
bash
# 拉取镜像到命名空间 k8s.io
ctr -n k8s.io image pull registry.aliyuncs.com/google_containers/pause:3.6
# 对镜像改名
ctr -n k8s.io i tag registry.aliyuncs.com/google_containers/pause:3.6  registry.k8s.io/pause:3.6

Your Kubernetes Experience

https://headlamp.dev/

记一次服务中断

不知道为何所有服务一下全部中断了,后来发现是因为kube-proxy服务出问题了,删除后自动恢复了

sh
k get pods -n kube-system | grep kube-proxy
k delete -n kube-system pod/kube-proxy-gkpd5

Reference