k8s系列文章二:集群配置

一、关闭交换分区

# 临时关闭分区
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,内存等等资源不足的时候,操作系统上的进程会变得不稳定!

  1. 编辑文件/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.解释一下阿里源库加速,省的朋友们到处找了(不配置加速的朋友,不用理会,哈哈哈)

  •      登录阿里站点

k8s系列文章二:集群配置_第1张图片

三、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往集群中添加节点时会用到

k8s系列文章二:集群配置_第2张图片

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
  • 查看节点状态

八、令牌概念

  • 令牌的用意是为了方便节点的加入
  • 令牌的获取方式有如下四种方式,任取其一皆可
  1. 初始化控制平面节点时,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 : --token  --discovery-token-ca-cert-hash sha256:
  1. 在控制平面节点的/etc/kubernetes/目录下找到生成的token文件,内容即为加入令牌。

  2. 使用kubeadm token list命令查看当前有效的加入令牌。

  3. 如果集群配置错误,可以使用kubeadm reset删除集群,重新执行kubeadm init来初始化集群启动并以此获取新令牌。注,可以配置-r --cri-socket=/var/run/containerd/containerd.sock来实现主机上pod的删除

  4. 若令牌过期(默认24h),可使用命令kubeadm token create --print-join-command生成新令牌

九、将子节点加入集群

  • 一定需要在子节点上运行

  • 其中token(即上一章提到的令牌)可通过kubeadm token list
# 加入集群命令
kubeadm join :6443 --token <生成的Token> --discovery-token-ca-cert-hash sha256:

十、安装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安装与集群配置

十四、结束!

你可能感兴趣的:(工具,部署,linux,kubernetes,容器,云原生)