Appearance
Centos国内安装Kubernetes
安装前准备
- Set SELinux in permissive mode (effectively disabling it)
sh
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
- 设置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
机器最少2个CPU,内存最少2G, 保证端口6443打开,用于内部机器互通
关闭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
crictl
和ctr
使用同样的 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
记一次服务中断
不知道为何所有服务一下全部中断了,后来发现是因为kube-proxy服务出问题了,删除后自动恢复了
sh
k get pods -n kube-system | grep kube-proxy
k delete -n kube-system pod/kube-proxy-gkpd5