【掌握K8S集群部署】手把手真正实现Kubernetes集群的配置与部署(附问题解决方法)
创始人
2024-02-20 23:48:55
0

1、环境准备

IPHOSTNAME
10.10.20.15k8s1
10.10.20.16k8s2
10.10.20.17k8s3

注意hostname不要用下划线、小数点与字母。

2、环境配置(所有节点)

# stop firewalld
systemctl stop firewalld
systemctl disable firewalld# disable selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0# disable sawp 
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab # config route forward
cat <> /etc/sysctl.d/k8s.conf# ipv6 config
echo 'net.bridge.bridge-nf-call-ip6tables = 1' >> /etc/sysctl.d/k8s.conf
echo 'net.bridge.bridge-nf-call-iptables = 1' >> /etc/sysctl.d/k8s.conf
echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.d/k8s.conf
echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.d/k8s.conf
echo "net.ipv6.conf.lo.disable_ipv6 = 1" >> /etc/sysctl.d/k8s.conf
echo "net.ipv6.conf.all.forwarding = 1"  >> /etc/sysctl.d/k8s.conf
modprobe br_netfilter
sysctl --system# config ipvs
cat <

3、安装Docker(所有节点)

# 删除系统自带docker组件
yum -y remove docker*
# 安装相关组件
yum -y install yum-utils
# 配置docker安装镜像源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# 查看可以安装的版本
yum list docker-ce --showduplicates | sort -r# 这里安装的是20.10.2版本,需与kubernetes匹配一致
yum install -y docker-ce-20.10.2  docker-ce-cli-20.10.2 containerd.io# 启动服务
systemctl start docker
systemctl enable docker# 配置镜像加速, 修改cgroupdriver
vi  /etc/docker/daemon.json
{"registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn"],"exec-opts": ["native.cgroupdriver=systemd"]
}#重启服务
systemctl daemon-reload
systemctl restart docker

4、安装K8S服务(所有节点)

# 卸载旧版本kubenetes
yum remove -y kubelet kubeadm kubectl# 设置K8S的yum安装源
cat < /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.gpghttp://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF# 查看可以安装的版本
yum list kubelet --showduplicates | sort -r# 安装kubelet、kubeadm、kubectl, 这里安装的版本为1.23.0, 可以支持上面的20.10.2版本
yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0# 开机启动kubelet
systemctl enable kubelet
systemctl start kubelet

5、配置Master主节点(主节点)

  1. 查看需要的镜像
[root@k8s1 ~]# kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.23.14
k8s.gcr.io/kube-controller-manager:v1.23.14
k8s.gcr.io/kube-scheduler:v1.23.14
k8s.gcr.io/kube-proxy:v1.23.14
k8s.gcr.io/pause:3.6
k8s.gcr.io/etcd:3.5.1-0
k8s.gcr.io/coredns/coredns:v1.8.6
  1. 下载镜像
# 创建脚本
vi images.sh
# 配置脚本内容
images=(kube-apiserver:v1.23.14kube-controller-manager:v1.23.14kube-scheduler:v1.23.14kube-proxy:v1.23.14pause:3.6etcd:3.5.1-0coredns:v1.8.6)
for imageName in ${images[@]} ; 
dodocker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done# 执行脚本
chmod +x images.sh && ./images.sh

如果需修改镜像标签, 命令(默认情况下不需改,下面初始化命令会指定对应空间名称):

docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName

3) 主节点执行初始化命令

# 初始化节点的配置信息
kubeadm init \
--apiserver-advertise-address=10.10.20.15 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.0 \
--service-cidr=10.20.0.0/16 \
--pod-network-cidr=10.30.0.0/16# --ignore-preflight-errors=Swap 参数可以忽略交换内存的提示错误

注意: 如果出现问题, 执行kubeadm reset进行还原。

如果出现初始化报错:

[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get "http://localhost:10248/healthz": dial tcp 127.0.0.1:10248: connect: connection refused.

执行重置命令, 再修改docker的cgroupdriver配置:

vi /etc/docker/daemon.json {"registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn"],"exec-opts": ["native.cgroupdriver=systemd"]}

重启docker:

systemctl daemon-reload
systemctl restart docker

初始化,执行成功后, 会出现如下提示:

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/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configAlternatively, if you are the root user, you can run:export KUBECONFIG=/etc/kubernetes/admin.confYou 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 10.10.20.15:16688 --token 6vmxut.lb3hvlxhux5suugx \--discovery-token-ca-cert-hash sha256:0f2b3e95ecee06bc40eca641548c3ca8afb86ebc2279f3fe2a75960330b0dbd1 

4)主节点执行初始化配置

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/configexport KUBECONFIG=/etc/kubernetes/admin.confkubeadm join 10.10.20.15:16688 --token 6vmxut.lb3hvlxhux5suugx \--discovery-token-ca-cert-hash sha256:0f2b3e95ecee06bc40eca641548c3ca8afb86ebc2279f3fe2a75960330b0dbd1 

5) 安装helm插件

wget https://get.helm.sh/helm-v3.6.0-linux-amd64.tar.gz
tar -zxvf helm-v3.6.0-linux-amd64.tar.gz
mv linux-amd64/helm  /usr/local/bin/

执行helm list检查能否正确识别。

6) 安装calico网络插件

下载tigera-operator插件, 地址: https://github.com/projectcalico/calico/releases

wget https://github.com/projectcalico/calico/releases/download/v3.23.3/tigera-operator-v3.23.3.tgz

安装calico:

helm install calico tigera-operator-v3.23.3.tgz

检查确认相关的pod处于Running状态:

watch kubectl get pods -n calico-system

输出结果:

Every 2.0s: kubectl get pods -n calico-system                                                                                                                                       
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-7bbdbd789c-jcvhz   1/1     Running   0          62m
calico-node-z6t9g                          1/1     Running   0          62m
calico-typha-9d5f49b9f-7xvw5               1/1     Running   0          62m

calico的api资源不建议采用kubectl来管理, 安装calicoctl插件来管理:

wget https://github.com/projectcalico/calico/releases/download/v3.23.3/calicoctl-linux-amd64
mv calicoctl-linux-amd64 kubectl-calico
chmod +x kubectl-calico

验证插件是否正常:

kubectl calico -h

7) 验证k8s的dns

运行curl 容器

kubectl run curl --image=radial/busyboxplus:curl -it

查看curl状态, kubectl describe pod curl 如果出现错误不能调度:

Events:Type     Reason            Age                 From               Message----     ------            ----                ----               -------Warning  FailedScheduling  38m                 default-scheduler  0/1 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate.Warning  FailedScheduling  23m (x14 over 37m)  default-scheduler  0/1 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate.

将master该为可调度:

 kubectl taint nodes --all node-role.kubernetes.io/master-

进入curl容器:

kubectl exec -it curl /bin/sh

进行解析,输出一下结果,确认正常:

[ root@curl:/ ]$ nslookup kubernetes.default
Server:    10.20.0.10
Address 1: 10.20.0.10 kube-dns.kube-system.svc.cluster.localName:      kubernetes.default
Address 1: 10.20.0.1 kubernetes.default.svc.cluster.local

6、部署一个Nginx应用服务

kubectl create deployment my-nginx --image=nginx

查看IP地址:

[root@k8s1 bin]# kubectl get pod -owide
NAME                               READY   STATUS    RESTARTS       AGE     IP              NODE   NOMINATED NODE   READINESS GATES
curl                               1/1     Running   0              121m    10.30.166.198   k8s1              
my-nginx-c54945c55-lhmlt           1/1     Running   0              8m27s   10.30.219.1     k8s3              
tigera-operator-56d4765449-tw7bv   1/1     Running   1 (136m ago)   140m    10.10.20.15     k8s1              

进行访问:

[root@k8s1 bin]# curl 10.30.219.1



Welcome to nginx!



Welcome to nginx!

If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.

应用服务部署成功, 可以正常访问。

选择对应的calico版本, 确定能够支持所安装kubernetes

查看地址: https://projectcalico.docs.tigera.io/archive/v3.23/getting-started/kubernetes/requirements

在这里插入图片描述

执行命令:

kubectl apply -f https://projectcalico.docs.tigera.io/archive/v3.23/manifests/tigera-operator.yaml
kubectl apply -f https://projectcalico.docs.tigera.io/archive/v3.23/manifests/custom-resources.yaml

7、部署Dashboard管理后台

下载配置文件:

wget  https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.0/aio/deploy/recommended.yaml

对外暴露, 修改recommended.yaml文件:

增加type: NodePort

...
spec:ports:- port: 443targetPort: 8443type: NodePort
...

执行: kubectl get svc -A 查看dashboard的对外访问端口:

在这里插入图片描述

chrome浏览器进行访问:

在这里插入图片描述

如果不能访问, 点击页面任意空白位置,盲敲:thisisunsafe 确认即可访问。

在这里插入图片描述

配置dashboard-config.yaml:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: kubernetes-dashboardnamespace: kube-systemannotations:nginx.ingress.kubernetes.io/ssl-redirect: "false"nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:ingressClassName: nginxtls:- hosts:- k8s.example.comsecretName: example-com-tls-secretrules:- host: k8s.example.comhttp:paths:- path: /pathType: Prefixbackend:service:name: kubernetes-dashboardport:number: 443

创建管理员:

kubectl create serviceaccount kube-dashboard-admin-sa -n kube-systemkubectl create clusterrolebinding kube-dashboard-admin-sa \
--clusterrole=cluster-admin --serviceaccount=kube-system:kube-dashboard-admin-sa

获取登录token:

[root@k8s1 ~]# kubectl -n kube-system get secret | grep kube-dashboard-admin-sa-token
kube-dashboard-admin-sa-token-jtfxk              kubernetes.io/service-account-token   3      78s

执行describe指令获取

[root@k8s1 ~]# kubectl describe -n kube-system secret/kube-dashboard-admin-sa-token-jtfxk
Name:         kube-dashboard-admin-sa-token-jtfxk
Namespace:    kube-system
Labels:       
Annotations:  kubernetes.io/service-account.name: kube-dashboard-admin-sakubernetes.io/service-account.uid: 85dabe0c-dd93-457e-b077-6c732e72a009Type:  kubernetes.io/service-account-tokenData
====
ca.crt:     1099 bytes
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IlBJV1FfTDN2ZWNIUTBMWVU2NGJ0WnRTVzF6QVNjZXlNWDNuY1o4S3B0V2MifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJlLWRhc2hib2FyZC1hZG1pbi1zYS10b2tlbi1qdGZ4ayIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJlLWRhc2hib2FyZC1hZG1pbi1zYSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6Ijg1ZGFiZTBjLWRkOTMtNDU3ZS1iMDc3LTZjNzMyZTcyYTAwOSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTprdWJlLWRhc2hib2FyZC1hZG1pbi1zYSJ9.YPke1H3fdH_Vmw2980e-Kn2yRWklcvOt3o9ryfedmD5SLR_lkkUZb996SwZPb0mxReZi7Gjws5JdDYKnskIgvTTp8encsQ2UpLiC0myyzPUg6KP_3IHiTJ52n40mFNaZ7BzdyyYizatDWB89LruE2QrhEXdgOFxe-Z1GvzMdUpeAzrhV_a_bfE5iCkWmiw1jmaVba3X_MLiDoVPdUsQRovk6oZCNAzs9ElS0Hvb-vt4Ye6zI68Z0q3An36QFRk1CIE2RZfysq92QRSKgvRf8SgKN1UqyGFr9ICQcZTeiL0wNFGk04t6Z83RTK5n0BzojTrZwT-r0OGJb5coBJIkLPA

通过token进行登录, 能够正确显示集群信息:

在这里插入图片描述

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...