kubeadm安装k8s 1.25单master集群

百度网盘链接:https://pan.baidu.com/s/15t_TSH5RRpCFXV-93JHpNw?pwd=8od3

1 kubeadm安装k8s 1.25单master集群

1.1 初始化安装k8s集群的实验环境

K8S集群角色

IP

主机名

安装的组件

控制节点

192.168.40.180

master1

apiserver、controller-manager、schedule、kubelet、etcd、kube-proxy、容器运行时、calico、keepalived、nginx

工作节点

192.168.40.181

node1

Kube-proxy、calico、coredns、容器运行时、kubelet

工作节点

192.168.40.182

node2

Kube-proxy、calico、coredns、容器运行时、kubelet

初始化操作三个节点均需要操作:

1.1.1 修改机器ip

# vim /etc/sysconfig/network-scripts/ifcfg-eth0

NAME=eth0

DEVICE=eth0

ONBOOT=yes

TYPE=Ethernet

BOOTPROTO=static

IPADDR=192.168.40.180

NETMASK=255.255.255.0

GATEWAY=192.168.40.253

DEFROUTE=yes

1.1.2 关闭selinux

# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

1.1.3 配置主机名称

# hostnamectl set-hostname docker && bash

1.1.4 关闭交换分区swap

# vim /etc/fstab   //注释swap挂载,给swap这行开头加一下注释。

#/dev/mapper/centos-swap swap  swap  defaults  0  0

1.1.5 修改机器内核参数

# modprobe br_netfilter

# echo "modprobe br_netfilter" >> /etc/profile

# cat > /etc/sysctl.d/k8s.conf <<EOF

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

net.ipv4.ip_forward = 1

EOF

# sysctl -p /etc/sysctl.d/k8s.conf

# vim /etc/rc.sysinit    //重启后模块失效,下面是开机自动加载模块的脚本,在/etc/新建rc.sysinit 文件

#!/bin/bash
for file in /etc/sysconfig/modules/*.modules; do
[ -x $file ] && $file
done

# vim /etc/sysconfig/modules/br_netfilter.modules    //在/etc/sysconfig/modules/目录下新建文件
modprobe br_netfilter

# chmod 755 /etc/sysconfig/modules/br_netfilter.modules    //增加权限

1.1.6 关闭防火墙

# systemctl stop firewalld; systemctl disable firewalld

1.1.7 配置yum源

备份基础repo源

# mkdir /root/repo.bak

# cd /etc/yum.repos.d/

# mv * /root/repo.bak/

下载阿里云的repo源,把CentOS-Base.repo和epel.repo文件上传到master1主机的/etc/yum.repos.d/目录下

配置国内阿里云docker的repo源

# yum -y install yum-utils

# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

1.1.8 配置时间同步

# yum -y install ntpdate     //安装ntpdate命令

# ntpdate cn.pool.ntp.org    //跟网络时间做同步

# crontab -e    //把时间同步做成计划任务

* */1 * * * /usr/sbin/ntpdate cn.pool.ntp.org

# service crond restart      //重启crond服务

1.1.9 安装基础软件包

# yum -y install yum-utils openssh-clients device-mapper-persistent-data lvm2 wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel vim ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack ntpdate telnet ipvsadm

1.2 安装containerd及docker服务

部署服务的操作三个节点均需要操作:

1.2.1 安装containerd

# yum install containerd.io-1.6.6 -y

1.2.2 配置containerd配置

# mkdir -p /etc/containerd

# containerd config default > /etc/containerd/config.toml    //生成containerd配置文件

# vim /etc/containerd/config.toml    //修改配置文件

把SystemdCgroup = false修改成SystemdCgroup = true

把sandbox_image = "k8s.gcr.io/pause:3.6"修改成sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.7"

1.2.3 配置 containerd 开机启动,并启动 containerd

# systemctl enable containerd  --now

1.2.4 修改/etc/crictl.yaml文件

# cat > /etc/crictl.yaml <<EOF

runtime-endpoint: unix:///run/containerd/containerd.sock

image-endpoint: unix:///run/containerd/containerd.sock

timeout: 10

debug: false

EOF

# systemctl restart containerd

1.2.5 配置containerd镜像加速器

# vim /etc/containerd/config.toml文件

将config_path = ""修改成如下目录:config_path = "/etc/containerd/certs.d"

# mkdir /etc/containerd/certs.d/docker.io/ -p

# vim /etc/containerd/certs.d/docker.io/hosts.toml

[host."https://vh3bm52y.mirror.aliyuncs.com",host."https://registry.docker-cn.com"]

  capabilities = ["pull"]

# systemctl restart containerd

1.2.6 安装docker服务

备注:docker也要安装,docker跟containerd不冲突,安装docker是为了能基于dockerfile构建镜像

# yum install docker-ce -y

# systemctl enable docker --now

1.2.7 配置docker镜像加速器

# vim /etc/docker/daemon.json    //配置docker镜像加速器

{

 "registry-mirrors":["https://vh3bm52y.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com"]

}

# systemctl daemon-reload

# systemctl restart docker

1.3 部署k8s集群

注:未标明具体节点的操作需要在三个节点上都执行。

1.3.1 配置安装k8s组件需要的阿里云的repo源

# vim /etc/yum.repos.d/kubernetes.repo

[kubernetes]

name=Kubernetes

baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/

enabled=1

gpgcheck=0

1.3.2 安装k8s初始化工具

# yum install -y kubelet-1.25.0 kubeadm-1.25.0 kubectl-1.25.0

# systemctl enable kubelet

Kubeadm:kubeadm是一个工具,用来初始化k8s集群的

kubelet:安装在集群所有节点上,用于启动Pod的

kubectl:通过kubectl可以部署和管理应用,查看各种资源,创建 删除和更新各种组件

1.3.3 设置容器运行时的endpoing

# crictl config runtime-endpoint /run/containerd/containerd.sock

1.3.4 使用kubeadm初始化k8s集群

[root@master1 ~]# kubeadm config print init-defaults > kubeadm.yaml

根据我们自己的需求修改配置,比如修改 imageRepository 的值,kube-proxy 的模式为 ipvs,需要注意的是由于我们使用的containerd作为运行时,所以在初始化节点的时候需要指定cgroupDriver为systemd。

# vim kubeadm.yaml

apiVersion: kubeadm.k8s.io/v1beta3

...

kind: InitConfiguration

localAPIEndpoint:

  advertiseAddress: 192.168.40.180   #控制节点的ip

  bindPort: 6443

nodeRegistration:

  criSocket: unix:///run/containerd/containerd.sock   #指定containerd容器运行时的endpoint

  imagePullPolicy: IfNotPresent

  name:  master1  #控制节点主机名

  taints: null

---

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    #指定从阿里云仓库拉取镜像

kind: ClusterConfiguration

kubernetesVersion: 1.25.0   #k8s版本

networking:

  dnsDomain: cluster.local

  podSubnet: 10.244.0.0/16    #指定pod网段

  serviceSubnet: 10.96.0.0/12 #指定Service网段

scheduler: {}

#在文件最后,插入以下内容,(复制时,要带着---)

---

apiVersion: kubeproxy.config.k8s.io/v1alpha1

kind: KubeProxyConfiguration

mode: ipvs

---

apiVersion: kubelet.config.k8s.io/v1beta1

kind: KubeletConfiguration

cgroupDriver: systemd

1.3.5 kubeadm初始化k8s集群

把初始化k8s集群需要的离线镜像包上传到所有节点,手动解压。(这一步可以不做,可以自动拉取镜像。)

# ctr -n=k8s.io images import k8s_1.25.0.tar.gz

1.3.6 基于kubeadm.yaml文件初始化k8s

[root@master1~]# kubeadm init --config=kubeadm.yaml --ignore-preflight-errors=SystemVerification

1.3.7 配置kubectl的配置文件

配置kubectl的配置文件config,相当于对kubectl进行授权,这样kubectl命令可以使用此证书对k8s集群进行管理

[root@master1 ~]# mkdir -p $HOME/.kube

[root@master1 ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

[root@master1 ~]# chown $(id -u):$(id -g) $HOME/.kube/config

[root@master1 ~]# kubectl get nodes

master1           NotReady   control-plane,master    60s   v1.20.6

此时集群状态还是NotReady状态,因为没有安装网络插件。

1.3.8 扩容k8s集群-添加node节点

在master1上查看加入节点的命令:

[root@master1 ~]# kubeadm token create --print-join-command

kubeadm join 192.168.40.199:16443 --token y23a82.hurmcpzedblv34q8 --discovery-token-ca-cert-hash sha256:1ba1b274090feecfef58eddc2a6f45590299c1d0624618f1f429b18a064cb728

 

把node1和node2加入k8s集群:

[root@node1 ~]# kubeadm token create --print-join-command

kubeadm join 192.168.40.199:16443 --token y23a82.hurmcpzedblv34q8 --discovery-token-ca-cert-hash sha256:1ba1b274090feecfef58eddc2a6f45590299c1d0624618f1f429b18a064cb728 --ignore-preflight-errors=SystemVerification

[root@node2 ~]# kubeadm token create --print-join-command

kubeadm join 192.168.40.199:16443 --token y23a82.hurmcpzedblv34q8 --discovery-token-ca-cert-hash sha256:1ba1b274090feecfef58eddc2a6f45590299c1d0624618f1f429b18a064cb728 --ignore-preflight-errors=SystemVerification

 

[root@master1 ~]# kubectl get nodes    //在master1上查看集群节点状况

NAME              STATUS     ROLES                  AGE     VERSION

master1           NotReady   control-plane,master   53m     v1.25.0

node1             NotReady   <none>                 58s     v1.25.0

node2             NotReady   <none>                 59s     v1.25.0

注意:上面状态都是NotReady状态,说明没有安装网络插件。

可以看到node1和node2的ROLES角色为空,<none>就表示这个节点是工作节点。

 

可以把node1和node2的ROLES变成work,按照如下方法:

[root@master1 ~]# kubectl label node node1 node-role.kubernetes.io/worker=worker

[root@master1 ~]# kubectl label node node2 node-role.kubernetes.io/worker=worker

[root@master1 ~]# kubectl get pods -n kube-system

NAME                                       READY   STATUS    RESTARTS   AGE

calico-kube-controllers-6744f6b6d5-nck2c   1/1     Running   0          5d21h

calico-node-58tzf                          1/1     Running   0          5d21h

calico-node-gjfb2                          1/1     Running   0          5d21h

calico-node-zvthj                          1/1     Running   0          5d21h

......

1.3.9 安装kubernetes网络组件-Calico

上传calico.yaml到master1上,使用yaml文件安装calico 网络插件(这里需要等几分钟才能ready)。

[root@master1 ~]# kubectl apply -f calico.yaml

注:在线下载配置文件地址是:https://docs.projectcalico.org/manifests/calico.yaml

[root@master1 ~]# kubectl get pods -n kube-system

[root@master1 ~]# kubectl get nodes

NAME      STATUS   ROLES           AGE     VERSION

master1   Ready    control-plane   5d22h   v1.25.0

node1     Ready    work            5d22h   v1.25.0

node2     Ready    work            5d21h   v1.25.0

1.3.10测试在k8s创建pod是否可以正常访问网络

[root@master1 ~]# kubectl run busybox --image busybox:1.28 --image-pull-policy=IfNotPresent --restart=Never --rm -it busybox -- sh

/ # ping www.baidu.com

PING www.baidu.com (39.156.66.18): 56 data bytes

64 bytes from 39.156.66.18: seq=0 ttl=127 time=39.3 ms

通过上面可以看到能访问网络,说明calico网络插件已经被正常安装了。

1.3.11 测试coredns是否正常

[root@master1 ~]# kubectl run busybox --image busybox:1.28 --restart=Never --rm -it busybox -- sh

/ # nslookup kubernetes.default.svc.cluster.local

Server:    10.96.0.10

Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

1.3.12 kubeadm初始化k8s证书过期解决方案

查看证书有效时间:

# openssl x509 -in /etc/kubernetes/pki/ca.crt -noout -text  |grep Not

# openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep Not

延长证书过期时间:

1.把update-kubeadm-cert.sh文件上传到master1节点

2.给update-kubeadm-cert.sh证书授权可执行权限

# chmod +x update-kubeadm-cert.sh

3.执行下面命令,修改证书过期时间,把时间延长到10年

# ./update-kubeadm-cert.sh all

4.在master1节点查询pod是否正常,能查询出数据说明证书签发完成

# kubectl get pods -n kube-system

5.再次查看证书有效期,可以看到会延长到10年

# openssl x509 -in /etc/kubernetes/pki/ca.crt -noout -text  |grep Not

# openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text  |grep Not

1.3.13 配置其他节点可执行kubectl命令

备注:以node1节点为例

[root@node1 ~]# mkdir /root/.kube    //在需要执行kubectl命令的节点上创建.kube目录

[root@master1 ~]# scp /root/.kube/config node1:/root/.kube/    //从master1上拷贝config文件到node1

 

posted @ 2022-12-27 00:08  Krill_ss  阅读(1083)  评论(1编辑  收藏  举报