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