(二)k8s——kubeadm 部署 K8S 1.20.11 详细版

前言:

1、在所有节点上安装Docker和kubeadm

2、部署Kubernetes Master

3、部署容器网络插件

4、部署 Kubernetes Node,将节点加入Kubernetes集群中

1、环境准备

1.1环境架构
IP 主机名 操作系统 Kubelet 版本 用途
192.168.10.160 master01 CentOS 7.9.2009 v1.20.11 管理节点
192.168.10.161 node01 CentOS 7.9.2009 v1.20.11 工作节点
192.168.10.163 node02 CentOS 7.9.2009 v1.20.11 工作节点

1.2环境准备

bash 复制代码
#所有节点,关闭防火墙规则,关闭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

1.3修改主机名

bash 复制代码
hostnamectl set-hostname master01
hostnamectl set-hostname node01
hostnamectl set-hostname node02

1.4所有节点修改hosts文件

bash 复制代码
vim /etc/hosts
192.168.10.160 master01
192.168.10.161 node01
192.168.10.163 node02

1.5调整内核参数

bash 复制代码
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

2、安装docker

bash 复制代码
所有节点安装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-20.10.18 docker-ce-cli-20.10.18 containerd.io

#配置加速器
mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://0a40cefd360026b40f39c00627fa6f20.mirror.swr.myhuaweicloud.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  }
}
EOF


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

docker info | grep "Cgroup Driver"
#确定状态为Cgroup Driver: systemd

3、安装kubeadm,kubelet和kubectl

bash 复制代码
#定义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.11 kubeadm-1.20.11 kubectl-1.20.11

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

4、部署K8S集群

bash 复制代码
#查看初始化需要的镜像
kubeadm config images list

#在 master 节点上传 v1.20.11.zip 压缩包至 /opt 目录
unzip v1.20.11.zip -d /opt/k8s

#复制镜像和脚本到 node 节点,并在 node 节点上执行脚本加载镜像文件
#这两个命令在master上执行,意思就是把master上的这个文件传到两个node节点:
scp -r /opt/k8s root@node01:/opt
scp -r /opt/k8s root@node02:/opt

#所有节点执行
cd /opt/k8s/v1.20.11
for i in $(ls *.tar); do docker load -i $i; done

#初始化kubeadm  在master节点
kubeadm config print init-defaults > /opt/kubeadm-config.yaml

cd /opt/
vim kubeadm-config.yaml
......
11 localAPIEndpoint:
12   advertiseAddress: 192.168.10.19		#指定master节点的IP地址
13   bindPort: 6443
......
34 kubernetesVersion: v1.20.11				#指定kubernetes版本号
35 networking:
36   dnsDomain: cludoster.local
37   podSubnet: "10.244.0.0/16"				#指定pod网段,10.244.0.0/16用于匹配flannel默认网段
38   serviceSubnet: 10.96.0.0/16			#指定service网段
39 scheduler: {}
#末尾再添加以下内容
--- 
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs									#把默认的kube-proxy调度方式改为ipvs模式

kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log
#--experimental-upload-certs 参数可以在后续执行加入节点时自动分发证书文件,K8S V1.16版本开始替换为 --upload-certs
#tee kubeadm-init.log 用以输出日志  
//查看 kubeadm-init 日志   
less kubeadm-init.log

//kubernetes配置文件目录
ls /etc/kubernetes/

//存放ca等证书和密码的目录
ls /etc/kubernetes/pki

#设定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
# 修改如下内容  两个文件中的ip都改成master的ip 然后端口注释

把--bind-address=127.0.0.1变成--bind-address=192.168.10.160		#修改成k8s的控制节点master01的ip
host=192.168.10.160  #每个需要写ip的地方都改
把httpGet:字段下的hosts由127.0.0.1变成192.168.10.160(有两处)
#- --port=0					# 搜索port=0,把这一行注释掉

systemctl restart kubelet
到这里  就是去查看 kubectl get cs  都成集群健康

[root@master01 opt] kubectl get node
NAME       STATUS     ROLES                  AGE   VERSION
master01   NotReady   control-plane,master   23m   v1.20.11

#在 node 节点上执行 kubeadm join 命令加入群集
cat /opt/kubeadm-init.log  #去master这里最后找到证书
kubeadm join 192.168.10.160:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:b233c7fdb50d00343ed0d6a39f7c0b99d6d43149f2dad08c84d326a96eacab5e 

这时:
[root@master01 opt] kubectl get node
NAME       STATUS     ROLES                  AGE   VERSION
master01   NotReady   control-plane,master   25m   v1.20.11
node01     NotReady   <none>                 17s   v1.20.11
node02     NotReady   <none>                 6s    v1.20.11

5、部署网络插件flannel

bash 复制代码
#所有节点上传flannel-cni-v1.2.0.tar  flannel-v0.22.2.tar 到 /opt 目录,master节点上传 kube-flannel.yml 文件
在所有节点上:
docker load -i flannel-cni-v1.2.0.tar
docker load -i flannel-v0.22.2.tar

//在 master 节点创建 flannel 资源
kubectl apply -f kube-flannel.yml 

kubectl get pods -n kube-system

//测试 pod 资源创建
kubectl create deployment nginx --image=nginx

kubectl get pods -o wide   #用于以更详细的方式列出当前命名空间中的所有 Pod

//暴露端口提供服务
kubectl expose deployment nginx --port=80 --type=NodePort

kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        3h57m
myapp-ky20   NodePort    10.96.56.120   <none>        80:32404/TCP   3s

//测试访问
curl http://node01:32404

kubectl get svc

#扩展3个副本
kubectl scale deployment nginx --replicas=5
kubectl get pods -o wide

6、部署 Dashboard

bash 复制代码
#在node节点
cd /opt
上传metrics-scraper.tar   dashboard.tar

docker load -i metrics-scraper.tar
docker load -i dashboard.tar

//在 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:     #在23行
  ports:
    - port: 443  
      targetPort: 8443   
      nodePort: 30001     #添加  对外暴露的端口
  type: NodePort          #添加
  selector:
    k8s-app: kubernetes-dashboard
    
kubectl get pods -A   #可以看到新添加的dashboard和metrics-scraper

kubectl apply -f recommended.yaml
kubectl get svc -n kubernetes-dashboard  #看端口是不是30001

7、创建service account并绑定默认cluster-admin管理员集群角色

bash 复制代码
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 就可以登陆可视化界面

#使用输出的token登录Dashboard 使用火狐或者360浏览器进行登录

https://NodeIP:30001

相关推荐
沫离痕1 天前
docker部署安装使用
云原生·eureka
迷茫运维路1 天前
【K8S集群漏洞扫描】kube-proxy进程所监听的443端口证书过期问题分析与解决
linux·容器·kubernetes·漏洞处理
派大鑫wink1 天前
DevOps与AIOps融合:智能化运维体系构建与实战
docker·容器·kubernetes
叫致寒吧1 天前
K8s 组网方案
云原生·容器·kubernetes
帅猛的Shic1 天前
Kubernetes五大核心控制器深度解析:从原理到实践
云原生·kubernetes
mr_orange_klj1 天前
关于k8s PV的AI问答(豆包)
人工智能·容器·kubernetes
星环处相逢1 天前
K8S 概念与安装全解析:从入门到部署
云原生·容器·kubernetes
大海绵啤酒肚1 天前
WordPress部署新玩法:利用NFS存储在Kubernetes中实现数据持久化
adb·容器·kubernetes
ghostwritten1 天前
云原生流量治理新标准:Kubernetes Gateway API 部署实践指南
云原生·kubernetes·gateway