kubeadm部署k8s-1.28

总览

本文将介绍如何通过kubeadm工具,部署k8s集群,操作步骤如下

  1. 准备工作:

    1. 配置yum源,repo(防被墙)
    2. 安装常用工具,同步时间
    3. 关闭防火墙,将SELinux配置为Permissive模式,关闭swap
    4. 加载ipvs模块,优化内核
  2. 在所有机器上安装docker

  3. 在所有机器上安装kubeadm, kubelet, kubectl

  4. 部署集群Master节点

  5. 安装CNI网络插件

  6. 部署集群工作节点

主机 IP 备注
master 192.168.124.10 k8s主节点
node1 192.168.124.11 k8s工作节点1
node2 192.168.124.12 k8s工作节点2

0、系统要求

安装之前,请确保操作系统满足如下要求:

  1. Linux内核操作系统,如CentOS,Ubuntu等
  2. 至少2 CPU, 2GB
  3. 集群中所有机器之间的网络必须是通的(公共或私有网络都可以)。
  4. 每个节点都有唯一的主机名、MAC地址和product_uuid
  5. 部署时要保证能连外网
  6. 用root用户部署
## 查看操作系统
cat /proc/version
hostnamectl

## 查看IP和MAC命令
ip link
ifconfig -a

## 查看product_uuid
cat /sys/class/dmi/id/product_uuid

1、准备工作-所有节点都要做

1.1、配置yum源,repo

# yum源
curl -o /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo

# docker repo
curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# kubernetes repo
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
       http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

# 缓存
yum clean all && yum makecache

1.2、安装常用工具,同步时间

yum -y install tree vim wget bash-completion bash-completion-extras lrzsz net-tools sysstat iotop iftop htop unzip nc nmap telnet bc  psmisc httpd-tools ntpdate

# 时区修改,如果/etc/localtime有软连接,不是Shanghai,可以直接删除,在软链接
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ntpdate ntp2.aliyun.com            # 同步阿里云服务器上的时间.
/sbin/hwclock --systohc            # 写入到bios系统    

1.3、检查防火墙是否关闭,关闭selinux,关闭swap分区

## 查看防火墙状态
firewall-cmd --state

## 如果防火墙是running,关闭防火墙
systemctl disable firewalld && systemctl stop firewalld


## 直接关闭SELinux 
setenforce 0
sed -ri 's#(SELINUX=).*#\1disabled#' /etc/selinux/config

# 临时关闭swap。如果不关闭,kubelet会启动失败
swapoff -a
# 永久防止开机自动挂载swap
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

1.4、加载ipvs模块,优化内核

# 加载ipvs模块
modprobe br_netfilter
modprobe -- ip_vs
modprobe -- ip_vs_sh
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- nf_conntrack_ipv4

# 验证ip_vs模块
lsmod |grep ip_vs
ip_vs_wrr              12697  0 
ip_vs_rr               12600  0 
ip_vs_sh               12688  0 
ip_vs                 145458  6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack          139264  2 ip_vs,nf_conntrack_ipv4
libcrc32c              12644  3 xfs,ip_vs,nf_conntrack

# 内核文件 
cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
vm.max_map_count=262144
EOF

# 生效并验证内核优化
sysctl -p /etc/sysctl.d/k8s.conf

2、安装docker-所有节点运行

2.1 安装启动docker

yum install docker-ce-19.0.0 docker-ce-cli-19.2.0 containerd.io -y

## 1. yum 安装
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

## 2. 配置docker
cat <<EOF > /etc/docker/daemon.json
{
     "registry-mirrors": [
         "https://registry.hub.docker.com",
         "http://hub-mirror.c.163.com",
         "https://docker.mirrors.ustc.edu.cn",
         "https://registry.docker-cn.com"
     ]
} 
EOF
   
## 3. 启动docker
systemctl start docker

## 4、验证是否成功启动
systemctl status docker

## 5、启动容器测试
docker run hello-world

2.2、配置containerd中pause镜像地址

为了防止安装过程中出现pause镜像下载失败的问题,建议运行containerd config dump > /etc/containerd/config.toml 命令,将当前配置导出到文件,并修改sandbox_image配置。

## 如果没有/etc/containerd/config.toml文件,将默认配置导出到/etc/containerd/config.toml。
containerd config default > /etc/containerd/config.toml

## 修改配置文件/etc/containerd/config.toml, 更改sandbox_image配置
[plugins]
  [plugins."io.containerd.grpc.v1.cri"]
    sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"

## PS: 如果生成的/etc/containerd/config.toml中没有如上配置项,可以运行如下命令导出当前所有配置项后再修改文件/etc/containerd/config.toml
# containerd config dump > /etc/containerd/config.toml

## 重启containerd
systemctl restart containerd

3、部署kubeadm,kubelet,kubectl

kubeadm:启动k8s集群的工具

kubelet: 该组件在集群中的所有机器上运行,并执行启动pod和容器之类的任务。

kubectl: 与集群通信的工具。可以只在master节点上安装

# yum安装
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

#指定安装版本
yum install -y  kubelet-1.19.0 kubeadm-1.19.0 kubectl-1.19.0 --disableexcludes=kubernetes
## 开机启动kubelet
systemctl enable --now kubelet

## 验证
kubeadm version

4、初始化Master节点-Master节点运行

4.1、更改配置文件

kubeadm init命令用于初始化master节点。kubeadm init 的参数可以通过命令行yaml文件进行配置。本文介绍如何通过yaml文件进行配置。可以通过kubeadm config print init-defaults命令得到一份默认配置,然后对其进行修改。

 kubeadm config print init-defaults > kubeadm.yaml

对kubeadm.yaml进行编辑,修改内容如下:

  1. 修改advertiseAddress为master IP地址
  2. imageRepository修改为registry.aliyuncs.com/google_containers,防止镜像拉不下来
  3. 建议将networking.podSubnet修改为10.244.0.0/16, 和后续安装的flannel CNI 插件的默认配置保持一致
piVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.124.10  ## change the IP of apiserver.
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock
  imagePullPolicy: IfNotPresent
  name: node
  taints: null
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers   ## change imageRepository to aliyun.
kind: ClusterConfiguration
kubernetesVersion: 1.28.0
networking:
  dnsDomain: cluster.local
  podSubnet: 10.244.0.0/16  ## add this line to config POD network. Same with CNI config.
  serviceSubnet: 10.96.0.0/12
scheduler: {}

如上配置文件等价于命令行:

kubeadm init \
  --apiserver-advertise-address=192.168.124.10 \
  --image-repository registry.aliyuncs.com/google_containers \
  --kubernetes-version v1.28.0 \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16 
  • –apiserver-advertise-address 集群通告地址
  • –image-repository 由于默认拉取镜像地址http://k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
  • –kubernetes-version K8s版本,与上面安装的一致
  • –service-cidr 集群内部虚拟网络,Pod统一访问入口
  • –pod-network-cidr Pod网络,与下面部署的CNI网络组件yaml中保持一致

4.2 提前pull镜像

## 验证配置文件格式是否正确
kubeadm config validate --config kubeadm.yaml

## 查看需要下载哪些镜像。需要关注下载的repository地址是否正确。
## 如上在kubeadm.yaml文件配置了imageRepository:registry.aliyuncs.com/google_containers,因此images会从aliyun的repo下载。

# 查看
[root@master ~]#  kubeadm config images list --config kubeadm.yaml

registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.0
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.28.0
registry.aliyuncs.com/google_containers/kube-scheduler:v1.28.0
registry.aliyuncs.com/google_containers/kube-proxy:v1.28.0
registry.aliyuncs.com/google_containers/pause:3.9
registry.aliyuncs.com/google_containers/etcd:3.5.9-0
registry.aliyuncs.com/google_containers/coredns:v1.10.1

## 拉取镜像
kubeadm config images pull --config kubeadm.yaml

4.3 kubeadm init初始化

运行kubeadm init --config kubeadm.yaml, 当看到Your Kubernetes control-plane has initialized successfully!时表示安装成功。

[root@master ~]#   kubeadm init --config kubeadm.yaml
... ...
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/

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

kubeadm join 192.168.246.133:6443 --token abcdef.0123456789abcdef \
        --discovery-token-ca-cert-hash sha256:9f7d37c768e658119242dfb49675eaeb3cbdbb7d191526bfa197dd92373b40ab

PS:最好将最后一行log需要记下来,worker节点安装会用到。

根据提示,退出root账户后运行命令

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

4.4、验证

## kubectl 运行正常. STATUS=NotReady是因为CNI插件还没装。
[shirley@master k8s_install]$ kubectl get node
NAME   STATUS     ROLES           AGE   VERSION
node   NotReady   control-plane   20m   v1.28.2

## 通过crictl命令可以查看到运行的container
[shirley@master k8s_install]$ sudo crictl ps -a

5、安装CNI网络插件

Kubernetes 它需要网络插件来提供集群内部和集群外部的网络通信。以下是一些常用的 k8s 网络插件:

  • Flannel:Flannel 是最常用的 k8s 网络插件之一,它使用了虚拟网络技术来实现容器之间的通信,支持多种网络后端,如 VXLAN、UDP 和 Host-GW。
  • Calico:Calico 是一种基于 BGP 的网络插件,它使用路由表来路由容器之间的流量,支持多种网络拓扑结构,并提供了安全性和网络策略功能。
  • Canal:Canal 是一个组合了 Flannel 和 Calico 的网络插件,它使用 Flannel 来提供容器之间的通信,同时使用 Calico 来提供网络策略和安全性功能。
  • Weave Net:Weave Net 是一种轻量级的网络插件,它使用虚拟网络技术来为容器提供 IP 地址,并支持多种网络后端,如 VXLAN、UDP 和 TCP/IP,同时还提供了网络策略和安全性功能。
  • Cilium:Cilium 是一种基于 eBPF (Extended Berkeley Packet Filter) 技术的网络插件,它使用 Linux 内核的动态插件来提供网络功能,如路由、负载均衡、安全性和网络策略等。
  • Contiv:Contiv 是一种基于 SDN 技术的网络插件,它提供了多种网络功能,如虚拟网络、网络隔离、负载均衡和安全策略等。
  • Antrea:Antrea 是一种基于 OVS (Open vSwitch) 技术的网络插件,它提供了容器之间的通信、网络策略和安全性等功能,还支持多种网络拓扑结构

5.1、安装flanne网络插件

1、下载kube-flannel.yml

## 1. 下载kube-flannel.yml
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

kube-flannel.yaml文件中,需要注意,net-conf.json里的network要和kubeadm.yaml里配置的networking.podSubnet相同

... ...
  net-conf.json: |
    {
      ### 这里的network和kubeadm.yaml里配置的networking.podSubnet相同 
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }
... ...

2、容器部署flannel

[root@master ~]# kubectl apply -f kube-flannel.yml
namespace/kube-flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created

6、初始化工作节点

6.1、运行kubeadm join将工作节点加入集群

如果master节点安装时,没有记录下token,或token超时(默认24小时),可以运行如下命令重新生成

#kubeadm token create --print-join-command

kubeadm join 192.168.124.10:6443 --token by8q23.65btteq9iud7ypso --discovery-token-ca-cert-hash sha256:9f7d37c768e658119242dfb49675eaeb3cbdbb7d191526bfa197dd92373b40ab

将上述命令粘贴到工作节点,将工作节点添加到集群

[root@node1 ~]# kubeadm join 192.168.124.10:6443 --token by8q23.65btteq9iud7ypso --discovery-token-ca-cert-hash 

6.2 验证

到master节点运行kubelet get node,可以看到加进来的node

kubectl get nodes

8、验证集群

如下通过创建一个deployment验证集群运行是否正常

## 创建deployment
[root@master ~]# kubectl create deployment nginx --image=nginx
deployment.apps/nginx created

## expose端口到宿主机
[root@master ~]# kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed

## -o wide参数可以看到nginx调度到哪个node上
[root@master ~]# kubectl get all -o wide
NAME                         READY   STATUS    RESTARTS   AGE   IP           NODE    NOMINATED NODE   READINESS GATES
pod/nginx-7854ff8877-h9njh   1/1     Running   0          84s   10.244.3.2   node1   <none>           <none>

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE    SELECTOR
service/kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        135m   <none>
###### 这里可以看到 nginx端口映射到宿主机的30907上
service/nginx        NodePort    10.101.192.239   <none>        80:31769/TCP   46s    app=nginx

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES   SELECTOR
deployment.apps/nginx   1/1     1            1           84s   nginx        nginx    app=nginx

NAME                               DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES   SELECTOR
replicaset.apps/nginx-7854ff8877   1         1         1       84s   nginx        nginx    app=nginx,pod-template-hash=7854ff8877

kubectl get all -o wide获取的信息可以看出,pod调度到了node1(本例中,node1的ip为192.168.124.11)节点,service将80端口映射到了宿主机上的31769端口上。因此,可以通过http://192.168.124.11:31769/`访问到nginx页面

posted @ 2024-03-04 13:01  汉斯小木屋  阅读(120)  评论(0)    收藏  举报