K8s集群部署

 #部署方式有多种,本文采用kubeadm组件的方式来部署K8s集群

安装要求:

  • 至少三台主机
  • 内存最少2G,CPU2核
  • 集群网络互通
  • 可以访问外网
  • 禁止swap分区

环境说明:

系统:ubuntu22.04.1 

版本信息:kubernetes:1.26.2 ,docker-ce:23.0.1 ,cri-docker:0.3.1

ip及节点概况:master:10.0.0.200,node1:10.0.0.201,node2:10.0.0.202 

部署前的准备:

#以下操作在全部节点上都要执行

1.设定时钟同步

apt install -y chrony
systemctl start chrony.service

2.设置主机名称解析

vim /etc/hosts
10.0.0.200 k8s-master.zhang.com
10.0.0.201 k8s-node1.zhang.com
10.0.0.202 k8s-node2.zhang.com

 3.禁用swap设备

1)关闭当前已启用的所有Swap设备

swapoff -a

2)编辑/etc/fstab,注释用于挂载swap设备的所有行,然后保存退出

 3)可以用free命令查看swap的使用情况,为0即可

 4.禁用防火墙服务

ufw disable
ufw status

部署k8s集群: 

  • 安装相关组件

1.部署docker

阿里云官方配置说明

#首先,生成docker-ce相关程序包的仓库,这里以阿里云的镜像服务器为例进行说明:

1)安装docker 

apt -y install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add -
add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
apt update
apt -y install docker-ce

2)添加配置

#kubelet需要让docker容器引擎使用systemd作为CGroup的驱动,其默认值为cgroupfs,因而,我们还需要编辑docker的配置文件/etc/docker/daemon.json,添加如下内容,其中的registry-mirrors用于指明使用的镜像加速服务

vim /etc/docker/daemon.json
{
"registry-mirrors": [
  "https://registry.docker-cn.com"
],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
  "max-size": "200m"
},
"storage-driver": "overlay2"  
}

3)配置完成后即可启动docker服务,并将其设置为随系统启动而自动引导

systemctl daemon-reload;systemctl start docker.service;systemctl enable docker.service

2.安装cri-docker

#GitHub网站可能需要科学上网才能访问

curl -LO https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.1/cri-dockerd_0.3.1.3-0.ubuntu-jammy_amd64.deb
apt install -y ./cri-dockerd_0.3.1.3-0.ubuntu-jammy_amd64.deb
systemctl status cri-docker.service

3.安装kubelet、kubeadm和kubectl

阿里云官方配置说明

#首先,在各主机上生成kubelet和kubeadm等相关程序包的仓库,这里以阿里云的镜像服务为例:

apt update && apt install -y apt-transport-https curl
curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat </etc/apt/sources.list.d/kubernetes.list

deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main

EOF
 apt update
apt install -y kubelet kubeadm kubectl
systemctl enable kubelet

 #安装完成后,要确保kubeadm等程序文件的版本,这将也是后面初始化Kubernetes集群时需要明确指定的版本号

  • 整合kubelet和cri-dockerd

1.配置cri-dockerd

#确保其能够正确加载到CNI插件,编辑/usr/lib/systemd/system/cri-docker.service文件,确保其[Service]配置段中的ExecStart的值类似如下内容:

ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --cni-bin-dir=/opt/cni/bin --cni-cache-dir=/var/lib/cni/cache --cni-conf-dir=/etc/cni/net.d

需要添加的各配置参数说明(各参数的值要与系统部署的CNI插件的实际路径相对应):

  • --network-plugin:指定网络插件规范的类型,这里要使用CNI;

  • --cni-bin-dir:指定CNI插件二进制程序文件的搜索目录;

  • --cni-cache-dir:CNI插件使用的缓存目录;

  • --cni-conf-dir:CNI插件加载配置文件的目录;

配置完成后,重载并重启cri-docker.service服务:

systemctl daemon-reload;systemctl restart cri-docker.service

2.配置kubelet

#配置kubelet,为其指定cri-dockerd在本地打开的Unix Sock文件的路径,该路径一般默认为“/run/cri-dockerd.sock“。编辑文件/etc/sysconfig/kubelet(若/etc/sysconfig目录不存在,则需要先创建该目录),为其添加 如下指定参数:

mkdir /etc/sysconfig
vim /etc/sysconfig/kubelet
KUBELET_KUBEADM_ARGS="--container-runtime=remote --container-runtime-endpoint=/run/cri-dockerd.sock"

#需要说明的是,该配置也可不进行,而是直接在后面的各kubeadm命令上使用“--cri-socket unix:///run/cri-dockerd.sock”选项

  • 初始化master节点

#需要说明的是由kubeadm部署的Kubernetes集群上,集群核心组件kube-apiserver、kube-controller-manager、kube-scheduler和etcd等均会以静态Pod的形式运行,它们所依赖的镜像文件默认来自于registry.k8s.io这一Registry服务之上。但我们无法直接访问该服务,常见的解决方案有两种,1是使用能够达到该服务的代理服务,2是使用国内的镜像服务器上的服务,例如:registry.aliyuncs.com/google_containers等

#这里说明一下:国内的镜像中还是缺少一个puase的镜像,下面是本人提供的网盘链接,自取即可

链接:https://pan.baidu.com/s/1DqPfTPGobVysto3c0CxTGw 
提取码:0624 

 下载后上传至系统中,然后使用docker load -i命令导入镜像即可

kubeadm init \        
--control-plane-endpoint="k8s-master.zhang.com" \
--kubernetes-version=v1.26.2 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--token-ttl=0 \
--cri-socket unix:///run/cri-dockerd.sock \
--upload-certs \ 
--image-repository=registry.aliyuncs.com/google_containers

命令中各选项的说明:

  • --image-repository:指定要使用的镜像仓库,默认为registry.k8s.io;

  • --kubernetes-version:kubernetes程序组件的版本号,它必须要与安装的kubelet程序包的版本号相同;

  • --control-plane-endpoint:控制平面的固定访问端点,可以是IP地址或DNS名称,会被用于集群管理员及集群组件的kubeconfig配置文件的API Server的访问地址;单控制平面部署时可以不使用该选项;

  • --pod-network-cidr:Pod网络的地址范围,其值为CIDR格式的网络地址,通常,Flannel网络插件的默认为10.244.0.0/16,Project Calico插件的默认值为192.168.0.0/16;

  • --service-cidr:Service的网络地址范围,其值为CIDR格式的网络地址,默认为10.96.0.0/12;通常,仅Flannel一类的网络插件需要手动指定该地址;

  • --apiserver-advertise-address:apiserver通告给其他组件的IP地址,一般应该为Master节点的用于集群内部通信的IP地址,0.0.0.0表示节点上所有可用地址;

  • --token-ttl:共享令牌(token)的过期时长,默认为24小时,0表示永不过期;为防止不安全存储等原因导致的令牌泄露危及集群安全,建议为其设定过期时长。未设定该选项时,在token过期后,若期望再向集群中加入其它节点,可以使用如下命令重新创建token,并生成节点加入命令。kubeadm token create --print-join-command

  • 初始化后的操作

下面是系统给的提示:

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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

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/

You can now join any number of the control-plane node running the following command on each as root:

  kubeadm join k8s-master.zhang.com:6443 --token f204xp.0b5v26zzwanp045h \
    --discovery-token-ca-cert-hash sha256:1702955d246c11bcd725e35472d659c5a299509dd14fdde4bcc372e5623f80d8 \
    --control-plane --certificate-key 2ca266fb50ac46f0bc7852fe83295cfc582d2ac25f36d06708c289cd4ebb0886

Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join k8s-master.zhang.com:6443 --token f204xp.0b5v26zzwanp045h \
    --discovery-token-ca-cert-hash sha256:1702955d246c11bcd725e35472d659c5a299509dd14fdde4bcc372e5623f80d8 

我们可以按照系统给的提示来执行:

1.Kubernetes集群管理员认证到Kubernetes集群时使用的kubeconfig配置文件

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

#下面定义环境变量的方法也可:

export KUBECONFIG=/etc/kubernetes/admin.conf

2.部署网络插件(此步在所有节点执行)

mkdir /opt/bin/
curl -L https://github.com/flannel-io/flannel/releases/download/v0.21.2/flanneld-amd64  -o /opt/bin/flanneld
chmod +x /opt/bin/flanneld

#向Kubernetes部署kube-flannel,(下面一步在master节点执行):

kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.20.2/Documentation/kube-flannel.yml

用下面命令确认pod的状态为"Running",即kube-flannel已正常运行:

kubectl get pods -n kube-flannel

 3.用下面命令验证master节点已经就绪

kubectl get nodes

  •  添加节点至集群中

1.使用系统给的提示中的kubeadm join命令

#需要说明的是,每个节点的token值都是不一样的,不要复制我这里的,看系统给的提示;

选项--cri-socket unix:///run/cri-dockerd.sock需要额外加上

kubeadm join k8s-master.zhang.com:6443 --token f204xp.0b5v26zzwanp045h \
--discovery-token-ca-cert-hash sha256:1702955d246c11bcd725e35472d659c5a299509dd14fdde4bcc372e5623f80d8 \
--cri-socket unix:///run/cri-dockerd.sock

2.使用下面命令验证节点添加结果

kubectl get nodes

K8s集群部署_第1张图片

  •  测试应用编排及服务访问

#我们部署一个nginx来进行测试

1.创建Deployment部署Nginx

kubectl create deployment nginx --image=nginx:1.22-alpine --replicas=1
kubectl get pods

 2.创建Service暴露Nginx

kubectl create service nodeport nginx --tcp=80:80
kubectl get service

  

nginx集群外部的访问端口是30799,我们就可以通过http://10.0.0.200:30799进行访问:

K8s集群部署_第2张图片

你可能感兴趣的:(K8s,kubernetes,docker,容器)