定制网站【云原生Kubernetes系列第五篇】kubeadm v1.20 部署K8S 集群架构(人生这道选择题,总会有遗憾)

定制网站系列文章目录

😜即日起,定制网站更新云原生相关知识,定制网站喜欢的小伙伴可以给我定制网站点个三连喔

😜定制网站收录至专栏

😜

😜

😜

😜

😜

😜

😜

😜

😜

😜

😜

😜

😜

😜

文章目录

前言

定制网站前面使用搭建了k8s,较为繁琐,定制网站本篇博客将介绍使用kubeadm搭建k8s以及部署Harbor私服。

一、部署步骤

  • 定制网站在所有节点上安装Docker和kubeadm

  • 部署 Master

  • 定制网站部署容器网络插件

  • 部署 Kubernetes Node,定制网站将节点加入Kubernetes集群中

  • 部署 Dashboard Web 页面,定制网站可视化查看Kubernetes资源

  • 部署 Harbor 私有仓库,定制网站存放镜像资源

二、实验环境

定制网站服务器类型IP地址安装组件
master(2C/4G,cpu定制网站核心数要求大于2)192.168.109.131docker、kubeadm、kubelet、kubectl、flannel
node01(2C/2G)192.168.109.132docker、kubeadm、kubelet、kubectl、flannel
node02(2C/2G)192.168.109.133docker、kubeadm、kubelet、kubectl、flannel
Harbor节点(hub.stevelu.com)192.168.109.136docker、docker-compose、harbor-offline-v1.2.2

环境准备(定制网站所有节点执行)

#所有节点,定制网站关闭防火墙规则,关闭selinux,关闭swap交换systemctl stop firewalldsystemctl disable firewalldsetenforce 0iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -Xswapoff -a		#定制网站交换分区必须要关闭sed -ri 's/.*swap.*/#&/' /etc/fstab	#永久关闭swap分区,&符号在sed定制网站命令中代表上次匹配的结果
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

#加载 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
  • 2

#定制网站修改主机名hostnamectl set-hostname master01hostnamectl set-hostname node01hostnamectl set-hostname node02hostnamectl set-hostname hub.stevelu.com
  • 1
  • 2
  • 3
  • 4
  • 5
#定制网站所有节点修改hosts文件vim /etc/hosts192.168.109.131 master01192.168.109.132 node01192.168.109.133 node02192.168.109.136 hub.stevelu.com
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

#调整内核参数cat > /etc/sysctl.d/kubernetes.conf << EOF#开启网桥模式,可将网桥的流量传递给iptables链net.bridge.bridge-nf-call-ip6tables=1net.bridge.bridge-nf-call-iptables=1#关闭ipv6协议net.ipv6.conf.all.disable_ipv6=1net.ipv4.ip_forward=1EOF#加载参数sysctl --system  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

三、所有节点安装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.iomkdir /etc/dockercat > /etc/docker/daemon.json <<EOF{  "exec-opts": ["native.cgroupdriver=systemd"],  "log-driver": "json-file",  "log-opts": {    "max-size": "100m"  }}EOF#使用Systemd管理的Cgroup来进行资源控制与管理,因为相对Cgroupfs而言,Systemd限制CPU、内存等资源更加简单和成熟稳定。#日志使用json-file格式类型存储,大小为100M,保存在/var/log/containers目录下,方便ELK等日志系统收集和管理日志。systemctl daemon-reloadsystemctl restart docker.servicesystemctl enable docker.service docker info | grep "Cgroup Driver"Cgroup Driver: systemd
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

四、master及node节点安装kubeadm,kubelet和kubectl

#定义kubernetes源cat > /etc/yum.repos.d/kubernetes.repo << EOF[kubernetes]name=Kubernetesbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64enabled=1gpgcheck=0repo_gpgcheck=0gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgEOFyum install -y kubelet-1.20.11 kubeadm-1.20.11 kubectl-1.20.11#开机自启kubeletsystemctl enable kubelet.service#K8S通过kubeadm安装出来以后都是以Pod方式存在,即底层是以容器方式运行,所以kubelet必须设置开机自启
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16


五、部署K8S集群

#查看初始化需要的镜像kubeadm config images list#在 master 节点上传所需要的镜像这里我使用一下载的镜像文件 v1.20.11.zip 压缩包至 /opt 目录cd /optunzip v1.20.11.zip#批量加载镜像文件cd v1.20.11/for i in $(ls *.tar); do docker load -i $i; done  #node节点操作cd /optunzip v1.20.11.zipfor i in $(ls *.tar); do docker load -i $i; done  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14


5.1 初始化kubeadm

方法一:#生成kubeadm-config.yaml配置文件kubeadm config print init-defaults > /opt/kubeadm-config.yamlcd /optvim kubeadm-config.yaml#--12行--通告地址advertiseAddress: 192.168.109.131#--34行--修改k8s版本号默认为1.20.0kubernetesVersion: v1.20.11#--37行--指定service的子网段serviceSubnet: 10.96.0.0/16#--38--添加pod的cni网络插件的网段这里我用的flannel模式如果用的calico模式网段则是192.168.0.0/16podSubnet: 10.244.0.0/16#--40--行添加kube-proxy的流量调度模式默认为iptables这里用ipvs---apiVersion: kubeproxy.config.k8s.io/v1alpha1kind: KubeProxyConfigurationmode: ipvs#--experimental-upload-certs 参数可以在后续执行加入节点时自动分发证书文件,k8sV1.16版本开始替换为 --upload-certs 、tee kubeadm-init.log 用以输出日志kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log#master节点查看集群状态kubectl get node
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28









#查看 kubeadm-init 日志此时还没有日志所以查看不到less kubeadm-init.log#kubernetes配置文件目录ls /etc/kubernetes/#存放ca等证书和密码的目录ls /etc/kubernetes/pki		
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

方法二:kubeadm init \--apiserver-advertise-address=192.168.239.10 \--image-repository registry.aliyuncs.com/google_containers \--kubernetes-version=v1.20.11 \--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,开启 ipvskubectl edit cm kube-proxy -n=kube-system#修改mode: ipvs#设定kubectl#kubectl需经由API server认证及授权后方能执行相应的管理操作,kubeadm 部署的集群为其生成了一个具有管理员权限的认证配置文件 /etc/kubernetes/admin.conf,它可由 kubectl 通过默认的 “$HOME/.kube/config” 的路径进行加载。mkdir -p $HOME/.kubecp -i /etc/kubernetes/admin.conf $HOME/.kube/configchown $(id -u):$(id -g) $HOME/.kube/config#如果 kubectl get cs 发现集群不健康,更改以下两个文件,搜索 --port=0,把这一行注释掉vim /etc/kubernetes/manifests/kube-scheduler.yaml - --port=0					# 搜索port=0,把这一行注释掉vim /etc/kubernetes/manifests/kube-controller-manager.yaml- --port=0					# 搜索port=0,把这一行注释掉systemctl restart kubelet
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

5.2 所有节点部署网络插件flannel

方法一:#master 节点上传 kube-flannel.yml及flannel.tar 文件到opt目录cd /opt#将镜像文件加载到本地docker load -i flannel.tar #将镜像文件传输到其他node节点scp flannel.tar node01:/optscp flannel.tar node02:/opt#所有node节点执行将镜像文件加载到本地docker load -i flannel.tar#在 master 节点创建 flannel 资源kubectl apply -f kube-flannel.yml 方法二:kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml//在 node 节点上执行 kubeadm join 命令加入群集kubeadm join 192.168.80.10:6443 --token rc0kfs.a1sfe3gl4dvopck5 \    --discovery-token-ca-cert-hash sha256:864fe553c812df2af262b406b707db68b0fd450dc08b34efb73dd5a4771d37a2
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21




#在master节点查看节点状态kubectl get nodes#查看所有命名空间kubectl get pods -A
  • 1
  • 2
  • 3
  • 4

#测试 pod 资源创建kubectl create deployment nginx --image=nginxkubectl get pods -o wideNAME                     READY   STATUS    RESTARTS   AGE     IP           NODE     NOMINATED NODE   READINESS GATESnginx-6799fc88d8-hj9wv   1/1     Running   0          3m49s   10.244.1.2   node01   <none>           <none>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

#暴露端口提供服务kubectl expose deployment nginx --port=80 --type=NodePortkubectl get svc  #查看资源暴露端口NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGEkubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        154mnginx        NodePort    10.96.58.254   <none>        80:32084/TCP   14s
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

5.3 测试访问

curl http://node01:32084

web访问http://192.168.109.132:32084


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

5.4 部署 Dashboard

#master节点操作#上传dashboard.tar和metrics-scraper.tar镜像文件这两个镜像文件不上传也没事会自动下载#dashboard.tar #供仪表板使用#metrics-scraper.tar #收集k8s资源的状态#加载镜像文件docker load -i dashboard.tardocker load -i metrics-scraper.tar#将镜像文件传输到其他node节点scp dashboard.tar metrics-scraper.tar node01:/optscp dashboard.tar metrics-scraper.tar node02:/opt
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

#所有node节点执行docker load -i dashboard.tardocker load -i metrics-scraper.tar
  • 1
  • 2
  • 3


#master节点上传 recommended.yaml 文件到 /opt/s 目录中,部署 CoreDNS cd /opt/vim recommended.yaml#默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部:kind: ServiceapiVersion: v1metadata:  labels:    k8s-app: kubernetes-dashboard  name: kubernetes-dashboard  namespace: kubernetes-dashboardspec:  ports:   - port: 443     targetPort: 8443     nodePort: 30001     #添加     type: NodePort          #添加     selector:         k8s-app: kubernetes-dashboardkubectl apply -f recommended.yaml     #配置资源kubectl get pods -n kubernetes-dashboard      #指定命名空间查看#使用输出的token登录Dashboardhttps:/192.168.109.133:30001
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26


#创建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 get secret -n kube-system |grep dashboard #查看命名空间kubectl describe secret dashboard-admin-token-bfmq5 -n kube-system #查看详细信息
  • 1
  • 2
  • 3
  • 4
  • 5



如果出现 configmaps is forbidden: User “system:anonymous” cannot list resource “configmaps” in group “” in the namespace “default”

执行一下命令

kubectl create clusterrolebinding test:anonymous --clusterrole=cluster-admin --user=system:anonymous
  • 1

六、部署Harbor仓库

# 上传 Docker-Compose 、 harbor-offline-installer-v1.2.2.tgz 到opt目录cd /optchmod +x /opt/docker-compose mv docker-compose /usr/local/bindocker-compose -vtar zxvf harbor-offline-installer-v1.2.2.tgz -C /usr/local/vim /usr/local/harbor/harbor.cfg--5行--修改,设置为Harbor服务器的IP地址或者域名hostname = hub.stevelu.com--9行--修改,设置为https协议ui_url_protocol = https
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

#生成证书mkdir -p /data/certcd /data/cert#生成私钥openssl genrsa -des3 -out server.key 2048输入两遍密码:000000
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

#生成证书签名请求文件openssl req -new -key server.key -out server.csr输入私钥密码:000000输入国家名:CN输入省名:BJ输入市名:BJ输入组织名:stevelu输入机构名:stevelu输入域名:hub.stevelu.com输入管理员邮箱:admin@stevelu.com其它全部直接回车
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11


#备份私钥cp server.key server.key.org#清除私钥密码openssl rsa -in server.key.org -out server.key输入私钥密码:000000#签名证书openssl x509 -req -days 1000 -in server.csr -signkey server.key -out server.crtchmod +x /data/cert/*cd /usr/local/harbor/./install.sh
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

浏览器访问:https://hub.stevelu.com用户名:admin密码:Harbor12345
  • 1
  • 2
  • 3

#获取一个nginx镜像docker pull nginx:1.14vim /etc/docker/daemon.json#添加配置"insecure-registries": ["https://hub.stevelu.com"],systemctl daemon-reloadsystemctl restart dockerdocker-compose restart#登录harbor仓库docker login -u admin -p Harbor12345 https://hub.stevelu.com#上传镜像docker tag nginx:1.14 hub.stevelu.com/library/nginx:v1  #修改标签docker push hub.stevelu.com/library/nginx:v1   #推送
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13



6.1 修改所有节点docker配置文件对接私有仓库

vim /etc/docker/daemon.json"insecure-registries": ["https://hub.stevelu.com"],systemctl restart docker
  • 1
  • 2
  • 3

master节点操作#从私有仓库获取镜像创建资源kubectl create deployment nginx-demo1 --image=hub.stevelu.com/library/nginx:v1 --port=80 --replicas=3kubectl get pods # 查看资源kubectl describe pod nginx-demo1-56975b76f8-glm7w  #可以看到资源所使用的镜像
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6


查看harbor日志

6.2 创建service资源让外界访问

kubectl expose deployment nginx-demo1 --port=80 --target-port=80kubectl get svcNAME          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGEkubernetes    ClusterIP   10.96.0.1      <none>        443/TCP        5h3mnginx         NodePort    10.96.58.254   <none>        80:32084/TCP   149mnginx-demo1   ClusterIP   10.96.153.0    <none>        80/TCP         19scurl 10.96.58.254
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

6.3 修改service资源类型为NodePort类型

kubectl edit svc nginx-demo1kubectl get svc 
  • 1
  • 2



七、内核参数优化方案

cat >/etc/sysctl.d/kubernetes.conf <<EOF net.bridge.bridge-nf-call-iptables=1net.bridge.bridge-nf-call-ip6tables=1net.ipv4.ip_forward=1net.ipv4.tcp_tw_recycle=0wm.swappiness=0   #禁止使用swap空问,只有当系统内存不足(ooM)时才允许使用它vm.overcommit_memory=1 #不检查物理内存是否够用vm.panic_on_oom=0    #开启ooM fs.inotify.max_user_instances=8192fs.inotify.max_user_watches=1048576fs.file-max=52706963            #指定最大文件句柄数fs.nr_open=52706963             #仅4.4以上版本支持net.ipv6.conf.all.disable_ipv6=1net.netfilter.nf_conntrack_max=2310720EOF
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发