五、部署K8S集群
#查看初始化需要的镜像 kubeadm config images list #在 master 节点上传所需要的镜像这里我使用一下载的镜像文件 v1.20.11.zip 压缩包至 /opt 目录 cd /opt unzip v1.20.11.zip #批量加载镜像文件 cd v1.20.11/ for i in $(ls *.tar); do docker load -i $i; done #node节点操作 cd /opt unzip v1.20.11.zip for i in $(ls *.tar); do docker load -i $i; done
5.1 初始化kubeadm
方法一: #生成kubeadm-config.yaml配置文件 kubeadm config print init-defaults > /opt/kubeadm-config.yaml cd /opt vim kubeadm-config.yaml #--12行--通告地址 advertiseAddress: 192.168.109.131 #--34行--修改k8s版本号默认为1.20.0 kubernetesVersion: v1.20.11 #--37行--指定service的子网段 serviceSubnet: 10.96.0.0/16 #--38--添加pod的cni网络插件的网段这里我用的flannel模式如果用的calico模式网段则是192.168.0.0/16 podSubnet: 10.244.0.0/16 #--40--行添加kube-proxy的流量调度模式默认为iptables这里用ipvs --- apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration mode: 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
#查看 kubeadm-init 日志此时还没有日志所以查看不到 less kubeadm-init.log #kubernetes配置文件目录 ls /etc/kubernetes/ #存放ca等证书和密码的目录 ls /etc/kubernetes/pki
方法二: 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,开启 ipvs kubectl 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/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(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
5.2 所有节点部署网络插件flannel
方法一: #master 节点上传 kube-flannel.yml及flannel.tar 文件到opt目录 cd /opt #将镜像文件加载到本地 docker load -i flannel.tar #将镜像文件传输到其他node节点 scp flannel.tar node01:/opt scp 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
#在master节点查看节点状态 kubectl get nodes #查看所有命名空间 kubectl get pods -A
#测试 pod 资源创建 kubectl create deployment nginx --image=nginx kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-6799fc88d8-hj9wv 1/1 Running 0 3m49s 10.244.1.2 node01 <none> <none>
#暴露端口提供服务 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 154m nginx NodePort 10.96.58.254 <none> 80:32084/TCP 14s
5.3 测试访问
curl http://node01:32084
web访问http://192.168.109.132:32084
#扩展3个副本 kubectl scale deployment nginx --replicas=3 kubectl get pods -o wide
5.4 部署 Dashboard
#master节点操作 #上传dashboard.tar和metrics-scraper.tar镜像文件这两个镜像文件不上传也没事会自动下载 #dashboard.tar #供仪表板使用 #metrics-scraper.tar #收集k8s资源的状态 #加载镜像文件 docker load -i dashboard.tar docker load -i metrics-scraper.tar #将镜像文件传输到其他node节点 scp dashboard.tar metrics-scraper.tar node01:/opt scp dashboard.tar metrics-scraper.tar node02:/opt
#所有node节点执行 docker load -i dashboard.tar docker load -i metrics-scraper.tar
#master节点上传 recommended.yaml 文件到 /opt/s 目录中,部署 CoreDNS cd /opt/ 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 #配置资源 kubectl get pods -n kubernetes-dashboard #指定命名空间查看 #使用输出的token登录Dashboard https:/192.168.109.133:30001
#创建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 #查看详细信息
如果出现 configmaps is forbidden: User “system:anonymous” cannot list resource “configmaps” in API group “” in the namespace “default”
执行一下命令
kubectl create clusterrolebinding test:anonymous --clusterrole=cluster-admin --user=system:anonymous