一、关闭交换分区
# 临时关闭分区
swapoff -a
# 永久\关闭自动挂载swap分区
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
二、修改cgroup管理器
ubuntu 系统,debian 系统,centos7 系统,都是使用 systemd 初始化系统的。systemd 这边已经有一套 cgroup 管理器了,如果容器运行时和 kubelet 使用 cgroupfs,此时就会存在 cgroups 和 systemd 两种 cgroup 管理器。也就意味着操作系统里面存在两种资源分配的视图,当操作系统上存在 CPU,内存等等资源不足的时候,操作系统上的进程会变得不稳定!
- 编辑文件/etc/docker/daemon.json
{
"exec-opts": [
"native.cgroupdriver=cgroupfs" # 可取值cgroupfs、systemd
],
"registry-mirrors": ["https://yne6emhg.mirror.aliyuncs.com"] # 改成自己的加速地址,当然没有的话也可以不配置,最多加速效果跟平时一样
}
2.配置生效
# 重启docker的伴随线程
sudo systemctl daemon-reload
# 重启docker
systemctl restart docker
3.解释一下阿里源库加速,省的朋友们到处找了(不配置加速的朋友,不用理会,哈哈哈)
- 登录阿里站点
三、CNI配置
- 配置之必要性
cat << EOF | tee /etc/cni/net.d/10-containerd-net.conflist
{
"cniVersion": "1.0.0",
"name": "containerd-net",
"plugins": [
{
"type": "bridge",
"bridge": "cni0",
"isGateway": true,
"ipMasq": true,
"promiscMode": true,
"ipam": {
"type": "host-local",
"ranges": [
[{
"subnet": "10.88.0.0/16"
}],
[{
"subnet": "2001:db8:4860::/64"
}]
],
"routes": [
{ "dst": "0.0.0.0/0" },
{ "dst": "::/0" }
]
}
},
{
"type": "portmap",
"capabilities": {"portMappings": true},
"externalSetMarkChain": "KUBE-MARK-MASQ"
}
]
}
EOF
四、初始化镜像配置
默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
- 两种安装方式,任选其一
- 方式一:自动安装
# 调用可选参数image-repository
# 查看默认镜像列表
kubeadm config images list
# 查看镜像地址调整为阿里源后的列表
kubeadm config images list --image-repository registry.aliyuncs.com/google_containers
# 安装阿里源镜像
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
- 方式二:手动安装
如果k8s的版本是1.24后的版本,选用如下形式安装镜像
# 查看所需镜像并写入txt文件中
kubeadm config images list > 1.txt
# 测试安装镜像
ctr images pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6
# 本地镜像打标签,其中n代表namespace,i代表images
ctr -n k8s.io i tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6 k8s.gcr.io/pause:3.6
# 正式环境应用,安装全部
# Ⅰ筛选1.txt中"registry.k8s.io/"内容并剔除
# Ⅱ执行安装命令
cat 1.txt |xargs -I {} ctr images pull registry.cn-hangzhou.aliyuncs.com/google_containers/{}
# 查看已安装
crictl img
如果k8s的版本是1.24前的版本,选用如下形式安装镜像
# 查看所需镜像并写入txt文件中
kubeadm config images list > 1.txt
# 测试安装组件镜像kube-apiserver
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.28.3
# 正式环境应用,安装全部
# Ⅰ筛选1.txt中"registry.k8s.io/"内容并剔除
# Ⅱ执行安装命令
cat 1.txt |xargs -I {} docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/{}
# 查看已安装
docker images
五、初始化集群
# 启动命令
kubeadm init
六、再初始化集群
- 第四步初始化肯定失败了?①容器container配置;②镜像库用的registry.k8s.io。①②需外网
- containerd是docker的子项目,但是现在已经独立出去了
- kubeadm在版本1.24之后的k8s管理中移除了对docker集成,反而使用了containerd
6.1、容器container配置
# 生成 containerd 的默认配置文件,后缀名一定是toml,不要质疑,因为我尝试过!
containerd config default > config.toml
# 查看 sandbox 的默认镜像仓库在文件中的第几行
cat config.toml | grep -n "sandbox_image"
# 编辑config.toml,定位到 sandbox_image,将 仓库地址修改成阿里源
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.8"
# 效果同上,只是地址稍微换了下
# sandbox_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.8"
# 将文件移动到默认路径
mkdir /etc/containerd
mv config.toml /etc/containerd/config.toml
# 重载containerd服务
systemctl daemon-reload
systemctl restart containerd.service
6.2、镜像库配置
# 生成 默认的初始化配置文件
kubeadm config print init-defaults > init-default.yaml
# 查看默认镜像库
cat init-default.yaml | grep imageRepository
# 编辑init-default.yaml
# 将默认的镜像仓库registry.k8s.io修改成阿里源registry.aliyuncs.com/google_containers
sed -i 's#registry.k8s.io#registry.aliyuncs.com/google_containers#' init-default.yaml
# 将master主机信息advertiseAddress: 1.2.3.4中的ip地址改成master主机实际地址172.21.1.254
sed -i 's#advertiseAddress: 1.2.3.4#advertiseAddress: 172.21.1.254#' init-default.yaml
# 将文件移动到默认地址
mv init-default.yaml /etc/kubernetes/init-default.yaml
6.3、在初始化ING
- 两种启动方式,任选其一
- ①加载配置文件并启动
# 此时,host主机信息存储在/etc/hosts,k8s基础信息在/etc/kubernetes/init-default.yaml中
kubeadm init --config=/etc/kubernetes/init-default.yaml
- ②命令行启动
kubeadm init:在主节点初始化 Kubernetes 控制平面节点。
- --image-repository registry.aliyuncs.com/google_containers:使用阿里云镜像仓库
- --kubernetes-version=v1.28.2:指定kubernetes版本,查询命令kubelet --version;
- --pod-network-cidr=10.244.0.0/16:指定pod的网段,与下面部署的CNI中保持一致 ;
- --service-cidr=10.96.0.0/12:机器内部虚拟网络,Pod统一访问入口
- --apiserver-advertise-address=172.21.1.254:指定master主机地址;
# 可以看到,提供的参数其实是可以替代<<5.2>>步骤,好处?自然是定制化书写方便咯!
kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.28.2(你的版本) --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --apiserver-advertise-address=172.21.1.254(你的IP地址)
6.4、结果分析
- [kubelet-start] 生成kubelet的配置文件”/var/lib/kubelet/config.yaml”
- [certificates]生成相关的各种证书
- [kubeconfig]生成相关的kubeconfig文件
- [bootstraptoken]生成token记录下来,后边使用kubeadm join往集群中添加节点时会用到
6.5、查看k8s日志
# 查看kubelet日志,其中-f是 --follow, -u是过滤出kubelet日志
journalctl -f -u kubelet
# 查看kubelet日志,也可以用如下命令,一样的
journalctl -xeu kubelet
七、配置kube-config
- Node是K8s集群中的一个工作节点,可以是物理机或虚拟机。Node上kubelet进程负责管理Pod生命周期。拥有唯一符NodeName
-
Pod是Kubernetes中最小的可部署单元,通常包含一个或多个容器。Pod在Node上运行,共享相同的网络命名空间和存储卷。Pod也有一个唯一的标识符,称为PodName。
-
Node和Pod之间的关系是一对多的关系,即一个Node上可以运行多个Pod,但一个Pod只能运行在一个Node上
- 查看节点状态
- 使kubectl与集群通信
# 通信
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 配置环境变量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile
-
查看节点状态
八、令牌概念
- 令牌的用意是为了方便节点的加入
- 令牌的获取方式有如下四种方式,任取其一皆可
- 初始化控制平面节点时,kubeadm init命令会打印出加入令牌:
kubeadm init
...
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
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 <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
-
在控制平面节点的/etc/kubernetes/目录下找到生成的token文件,内容即为加入令牌。
-
使用kubeadm token list命令查看当前有效的加入令牌。
-
如果集群配置错误,可以使用kubeadm reset删除集群,重新执行kubeadm init来初始化集群启动并以此获取新令牌。注,可以配置-r --cri-socket=/var/run/containerd/containerd.sock来实现主机上pod的删除
-
若令牌过期(默认24h),可使用命令kubeadm token create --print-join-command生成新令牌
九、将子节点加入集群
-
一定需要在子节点上运行
- 其中token(即上一章提到的令牌)可通过kubeadm token list
# 加入集群命令
kubeadm join <Master节点ip>:6443 --token <生成的Token> --discovery-token-ca-cert-hash sha256:<Kubelte Init时生成的hash>
十、安装Pod网络插件
例如Calico或Flannel:
# calico
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
# flannel
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml --no-check-certificate
# 应用启动网络容器flannel
kubectl apply -f kube-flannel.yml
十一、查看集群
kubectl get nodes
kubectl get pods --all-namespaces
kubectl get pods -n kube-system
十二、dashboard可视化
- PASS
十三、引申
-
非阿里源库的k8s安装与集群配置