【kubernetes】kubeadm部署k8s集群(3主3从+keepalived/nginx负载均衡高可用)

目录

一、完成系统初始化

步骤一:常规环境初始化

步骤二:内核版本升级以及内核限制文件参数修改

步骤三:提前准备好负载均衡器和keepalived(接着之前的二进制部署修改的)

二、所有节点部署docker,以及指定版本的kubeadm

步骤一:所有节点完成docker部署

[​编辑 步骤二:所有节点安装kubeadm,kubelet和kubectl](#编辑 步骤二:所有节点安装kubeadm,kubelet和kubectl)

三、在master01完成kubeadm初始化

步骤一:在master01节点上,完成kubeadm初始化

[步骤二:修改了 kubeadm-config.yaml,将其传输给其他master节点,先完成所有master节点的镜像拉取](#步骤二:修改了 kubeadm-config.yaml,将其传输给其他master节点,先完成所有master节点的镜像拉取)

步骤三:在master01节点上完成证书生成

步骤四:master01根据提示信息完成kubectl的集群引导文件

四、完成其他master节点和node节点加入k8s集群中

步骤一:根据提示信息完成master02/03与集群对接

步骤二:根据提示信息完成master02/03的kubectl初始化

五、完成所有node节点加入k8s集群,部署网络插件calico

步骤一:所有node节点按照提示信息加入k8s集群中​编辑

步骤一:部署网络插件calico(在master01节点上传)

六、部署dashboard

七、总结kubeadm部署k8s集群的步骤


一、完成系统初始化

步骤一:常规环境初始化

复制代码
//所有节点,关闭防火墙规则,关闭selinux,关闭swap交换
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
swapoff -a						#交换分区必须要关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab		#永久关闭swap分区,&符号在sed命令中代表上次匹配的结果
#加载 ip_vs 模块
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done

//修改主机名
hostnamectl set-hostname master01/master02/master03
hostnamectl set-hostname node01/node02/node03

//所有节点修改hosts文件
cat >> /etc/hosts  << EOF
192.168.20.15 master01
192.168.20.16 master02
192.168.20.17 master03
192.168.20.10 node01
192.168.20.12 node02
192.168.20.30 node03
EOF

//调整内核参数
cat > /etc/sysctl.d/kubernetes.conf << EOF
#开启网桥模式,可将网桥的流量传递给iptables链
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
#关闭ipv6协议
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOF

//生效参数
sysctl --system  

步骤二:内核版本升级以及内核限制文件参数修改

复制代码
//内核升级
cat > /etc/yum.repos.d/elrepo.repo <<EOF
[elrepo]
name=elrepo
baseurl=https://mirrors.aliyun.com/elrepo/kernel/el7/x86_64
gpgcheck=0
enabled=1
EOF

yum install -y kernel-lt kernel-lt-devel

awk -F\' '$1=="menuentry "{print i++ ":" $2}' /etc/grub2.cfg 

grub2-set-default 0

reboot

uname -r

复制代码
cat >> /etc/security/limits.conf <<EOF
* hard noproc 65535
* soft  noproc 65535
* hard nofile 65535
* soft nofile 65535
* hard memlock unlimited
* soft  memlock unlimited
EOF

步骤三:提前准备好负载均衡器和keepalived(接着之前的二进制部署修改的)

二、所有节点部署docker,以及指定版本的kubeadm

步骤一:所有节点完成docker部署

复制代码
yum install -y yum-utils device-mapper-persistent-data lvm2 
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 
yum install -y docker-ce docker-ce-cli containerd.io

mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://6ijb8ubo.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "500m", "max-file": "3"
  }
}
EOF
#使用Systemd管理的Cgroup来进行资源控制与管理,因为相对Cgroupfs而言,Systemd限制CPU、内存等资源更加简单和成熟稳定。
#日志使用json-file格式类型存储,大小为100M,保存在/var/log/containers目录下,方便ELK等日志系统收集和管理日志。

systemctl daemon-reload
systemctl restart docker.service
systemctl enable --now docker.service 

docker info | grep "Cgroup Driver"
Cgroup Driver: systemd

步骤二:所有节点安装kubeadm,kubelet和kubectl

复制代码
-------------------- 所有节点安装kubeadm,kubelet和kubectl --------------------
//定义kubernetes源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

yum install -y kubelet-1.20.15 kubeadm-1.20.15 kubectl-1.20.15

//开机自启kubelet
systemctl enable kubelet.service
#K8S通过kubeadm安装出来以后都是以Pod方式存在,即底层是以容器方式运行,所以kubelet必须设置开机自启


//查看初始化需要的镜像
kubeadm config images list --kubernetes-version 1.20.15

三、在master01完成kubeadm初始化

步骤一:在master01节点上,完成kubeadm初始化

复制代码
kubeadm config print init-defaults > /opt/kubeadm-config.yaml

//修改yaml文件

kubeadm-config.yaml修改

复制代码
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
#设置当前主机监听的公告地址
  advertiseAddress: 192.168.20.15
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: master01
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
#设置master的节点以及负载均衡器的vip地址
  certSANs:
  - 192.168.20.15
  - 192.168.20.16
  - 192.168.20.17
  - 192.168.20.100
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
#设置vip的连接地址和端口号
controlPlaneEndpoint: "192.168.20.100:6443"
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
#修改拉取镜像的仓库为阿里云
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration
#指定kubernetes的版本号
kubernetesVersion: v1.20.15
networking:
  dnsDomain: cluster.local
#指定pod网段,一般来说10.244.0.0对应是的flannel网络插件
  podSubnet: "10.244.0.0/16"
#指定service的网段
  serviceSubnet: 10.96.0.0/16
scheduler: {}
---
##把默认的kube-proxy调度方式改为ipvs模式
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs

步骤二:修改了kubeadm-config.yaml,将其传输给其他master节点,先完成所有master节点的镜像拉取

复制代码
//在线拉取镜像
kubeadm config images pull --config /opt/kubeadm-config.yaml

步骤三:在master01节点上完成证书生成

复制代码
//初始化 master
kubeadm init --config=/opt/kubeadm-config.yaml --upload-certs | tee kubeadm-init.log
#--upload-certs 参数可以在后续执行加入节点时自动分发证书文件
#tee kubeadm-init.log 用以输出日志
复制代码
[root@master01 k8s]# ls
kubeadm-config.yaml  kubeadm-init.log
[root@master01 k8s]# ls /etc/kubernetes/
admin.conf  controller-manager.conf  kubelet.conf  manifests  pki  scheduler.conf
[root@master01 k8s]# ls /etc/kubernetes/pki/
apiserver.crt              apiserver-etcd-client.key  apiserver-kubelet-client.crt  ca.crt  etcd                front-proxy-ca.key      front-proxy-client.key  sa.pub
apiserver-etcd-client.crt  apiserver.key              apiserver-kubelet-client.key  ca.key  front-proxy-ca.crt  front-proxy-client.crt  sa.key
[root@master01 k8s]# ls /etc/kubernetes/manifests/
etcd.yaml  kube-apiserver.yaml  kube-controller-manager.yaml  kube-scheduler.yaml

接下来需要根据提示去部署k8s集群其他节点

还可以通过命令行+参数直接初始化

复制代码
kubeadm init \
--apiserver-advertise-address=192.168.80.10 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.20.15 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16 \
--token-ttl=0
--------------------------------------------------------------------------------------------
初始化集群需使用kubeadm init命令,可以指定具体参数初始化,也可以指定配置文件初始化。
可选参数:
--apiserver-advertise-address:apiserver通告给其他组件的IP地址,一般应该为Master节点的用于集群内部通信的IP地址,0.0.0.0表示节点上所有可用地址
--apiserver-bind-port:apiserver的监听端口,默认是6443
--cert-dir:通讯的ssl证书文件,默认/etc/kubernetes/pki
--control-plane-endpoint:控制台平面的共享终端,可以是负载均衡的ip地址或者dns域名,高可用集群时需要添加
--image-repository:拉取镜像的镜像仓库,默认是k8s.gcr.io
--kubernetes-version:指定kubernetes版本
--pod-network-cidr:pod资源的网段,需与pod网络插件的值设置一致。Flannel网络插件的默认为10.244.0.0/16,Calico插件的默认值为192.168.0.0/16;
--service-cidr:service资源的网段
--service-dns-domain:service全域名的后缀,默认是cluster.local
--token-ttl:默认token的有效期为24小时,如果不想过期,可以加上 --token-ttl=0 这个参数
---------------------------------------------------------------------------------------------

方法二初始化后需要修改 kube-proxy 的 configmap,开启 ipvs
kubectl edit cm kube-proxy -n=kube-system
修改mode: ipvs

步骤四:master01根据提示信息完成kubectl的集群引导文件

复制代码
//设定kubectl
kubectl需经由API server认证及授权后方能执行相应的管理操作,kubeadm 部署的集群为其生成了一个具有管理员权限的认证配置文件 /etc/kubernetes/admin.conf,它可由 kubectl 通过默认的 "$HOME/.kube/config" 的路径进行加载。

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

如果 kubectl get cs 发现集群不健康,更改以下两个文件

复制代码
//如果 kubectl get cs 发现集群不健康,更改以下两个文件
vim /etc/kubernetes/manifests/kube-scheduler.yaml 
vim /etc/kubernetes/manifests/kube-controller-manager.yaml
# 修改如下内容
把--bind-address=127.0.0.1变成--bind-address=192.168.20.15		#修改成k8s的控制节点master01的ip
把httpGet:字段下的hosts由127.0.0.1变成192.168.20.15(有两处)
#- --port=0					# 搜索port=0,把这一行注释掉

systemctl restart kubelet

复制代码
[root@master01 k8s]# vim /etc/kubernetes/manifests/kube-scheduler.yaml
[root@master01 k8s]# vim /etc/kubernetes/manifests/kube-controller-manager.yaml 
[root@master01 k8s]# systemctl restart kubelet.service 
[root@master01 k8s]# kubectl get cs

四、完成其他master节点和node节点加入k8s集群中

其他master节点:

步骤一:根据提示信息完成master02/03与集群对接

步骤二:根据提示信息完成master02/03的kubectl初始化

五、完成所有node节点加入k8s集群,部署网络插件calico

步骤一:所有node节点按照提示信息加入k8s集群中

步骤一:部署网络插件calico(在master01节点上传)

验证一下

六、部署dashboard

复制代码
//在 master01 节点上操作
#上传 recommended.yaml 文件到 /opt/k8s 目录中
cd /opt/k8s
vim recommended.yaml
#默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部:
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001     #添加
  type: NodePort          #添加
  selector:
    k8s-app: kubernetes-dashboard
	
kubectl apply -f recommended.yaml

#创建service account并绑定默认cluster-admin管理员集群角色
kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

#使用输出的token登录Dashboard
https://NodeIP:30001

七、总结kubeadm部署k8s集群的步骤

K8S kubeadm搭建
kubeadm init:在使用kubeadm方式安装K8S集群时,可根据初始化配置文件或配置参数选项快速的初始化生成一个K8S的master管理平台
kubeadm join:根据kubeadm init初始化的提示信息快速的将一个node节点或其它master节点加入到K8S集群里

1)所有节点进行初始化,安装容器引擎、kubeadm、kubelet、kubectl,部署 nginx/haproxy 负载均衡器和 keepalived 高可用
2)执行 kubeadm config print init-defaults 命令生成K8S集群初始化配置文件并进行修改
3)执行 kubeadm init --config 指定初始化配置文件进行K8S集群的初始化,生成K8S的master管理控制节点
4)在其它节点执行 kubeadm join 命令将node节点或其它master节点加入到K8S集群里
5)安装 cni 网络插件(flannel或calico)

更新kubeadm搭建的K8S的证书有效期

1)备份老证书和kubeconfig配置文件

mkdir /root/k8s.bak

cp -r /etc/kubernetes/pki /root/k8s.bak/

cp /etc/kubernetes/*.yaml /root/k8s.bak/

2)更新证书

kubeadm alpha certs renew all --config=/opt/k8s/kubeadm-config.yaml

3)更新kubeconfig配置文件

kubeadm init phase kubeconfig all --config=/opt/k8s/kubeadm-config.yaml

4)重启kubelet进程和其它K8S组件的Pod

systemctl restart kubelet

mv /etc/kubernetes/manifests/*.yaml /tmp

mv /tmp/*.yaml /etc/kubernetes/manifests/

5)查看证书有效期

kubeadm alpha certs check-expiration

openssl x509 -noout -dates -in /etc/kubernetes/pki/XXX.crt

相关推荐
小诸葛的博客2 分钟前
k8s localpath csi原理
云原生·容器·kubernetes
小猿姐4 小时前
闲谈KubeBlocks For MongoDB设计实现
mongodb·云原生·kubernetes
apocelipes4 小时前
golang unique包和字符串内部化
java·python·性能优化·golang
Full Stack Developme5 小时前
java.text 包详解
java·开发语言·python
fruge6 小时前
Ubuntu服务器已下载Nginx安装包的安装指南
服务器·nginx·ubuntu
刘梦凡呀6 小时前
C#获取钉钉平台考勤记录
java·c#·钉钉
thinktik6 小时前
AWS EKS 集成Load Balancer Controller 对外暴露互联网可访问API [AWS 中国宁夏区]
后端·kubernetes·aws
tryCbest6 小时前
Linux使用Docker部署项目后期更新
linux·运维·docker
best_virtuoso6 小时前
PostgreSQL 常见数组操作函数语法、功能
java·数据结构·postgresql
yudiandian20146 小时前
02 Oracle JDK 下载及配置(解压缩版)
java·开发语言