🉑️s - Jommy328/Harbor GitHub Wiki

K8s核⼼优势

  • 基于yaml⽂件实现容器的⾃动创建、删除
  • 更快速实现业务的弹性横向扩容
  • 动态发现新扩容的容器并对⾃动⽤户提供访问
  • 更简单、更快速的实现业务代码升级和回滚

组件介绍

kube-apiserver

https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-apiserver/

  • 提供了集群管理的REST API接口(包括认证授权、数据校验以及集群状态变更)
  • 提供其他模块之间的数据交互和通信的枢纽(其他模块通过API Server查询或修改数据,只有API Server才直接操作etcd)
  • 资源配额控制的入口

kube-scheduler

https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-scheduler/

  • Kubernetes的pod调度器,负责将Pods指派到合法的节点上
  • 调度器之后对所有合法的节点进行排序,将 Pod 绑定到一个合适的节点
  • 需要考虑独⽴的和集体的资源需 求、服务质量需求、硬件/软件/策略限制、亲和与反亲和规范等需求

kube-controller-manager

https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-controller-manager/

  • 集群内部的管理控制中⼼,负责集群内的Node、 Pod副本、服务端点(Endpoint)、命名空间(Namespace)、服务账号(ServiceAccount)、资源定额(ResourceQuota)的管理

  • 当某个Node意外宕机时,会及时发现并执⾏⾃动 化修复流程,确保集群中的pod副本始终处于预期的⼯作状态

kube-proxy

https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-proxy/

  • ⽹络代理运⾏在 node 上,它反映了 node 上 Kubernetes API 中定义的服 务,并可以通过⼀组后端进⾏简单的 TCP、UDP 和 SCTP 流转发或者在⼀组后端进⾏循环 TCP、UDP 和 SCTP 转发
  • ⽤户必须使⽤ apiserver API 创建⼀个服务来配置代理,其实就是kube-proxy通过在主机上 维护⽹络规则并执⾏连接转发来实现Kubernetes服务访问。

kubelet

https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kubelet/

  • 运⾏在每个worker节点的代理组件,它会监视已分配给节点的pod
  • 向master汇报node节点的状态信息
  • 接受指令并在Pod中创建 docker容器
  • 准备Pod所需的数据卷
  • 返回pod的运⾏状态
  • 在node节点执⾏容器健康检查

etcd

https://kubernetes.io/zh/docs/tasks/administer-cluster/configure-upgrade-etcd/

  • Kubernetes默认使⽤的key-value数据存储系统,⽤于保存所有集群数 据,⽀持分布式集群功能,⽣产环境使⽤时需要为etcd数据提供定期备份机制。

  • 运行的 etcd 集群个数成员为奇数

  • 确保不发生资源不足

  • 保持 etcd 集群的稳定对 Kubernetes 集群的稳定性至关重要。 因此,请在专用机器或隔离环境上运行 etcd 集群,以满足 所需资源需求

  • 在生产中运行的 etcd 的最低推荐版本是 3.2.10+

Kubernetes 主要由以下几个核心组件组成:

etcd 			#保存了整个集群的状态;
kube-apiserver  #提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册等机制;
kube-controller-manager  #负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
kube-scheduler 	#负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上;
kubelet       	#负责维持容器的生命周期,同时也负责 Volume(CVI)和网络(CNI)的管理;
Container runtime #负责镜像管理以及 Pod 和容器的真正运行(CRI),默认的容器运行时Docker;
kube-proxy 		#负责为 Service 提供 cluster 内部的服务发现和负载均衡;

#可选组件:
 kube-dns:负责为整个集群提供DNS服务
 Ingress Controller:为服务提供外⽹⼊⼝
 Heapster:提供资源监控
 Dashboard:提供GUI
 Federation:提供跨可⽤区的集群
 Fluentd-elasticsearch:提供集群⽇志采集、存储与查询

k8s安装部署

安装方式

kubeadm

https://v1-18.docs.kubernetes.io/zh/docs/setup/independent/create-cluster-kubeadm/#

kubeadm项⽬成熟度及维护周期。

使⽤k8s官⽅提供的部署⼯具kubeadm⾃动安装,需要在master和node节点上安装docker等组件,然 后初始化,把管理端的控制服务和node上的服务都以pod的⽅式运⾏。

基础环境准备

注意: 禁⽤swap 关闭selinux 关闭iptables

优化内核参数及资源限制参数

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1 #⼆层的⽹桥在转发包时会被宿主机iptables的FORWARD规则匹配
角色 机名 地址
k8s-master kubeadm-master.example.local 39.104.82.78
node1 node1.example.local 39.104.85.12
node2 node2.example.local 39.104.91.57

安装kubeadm等组件

在master和node节点安装kubeadm 、kubelet、kubectl、docker等组件,负载均衡服务器不需要安装。

版本选择

在每个master节点和node节点安装docker

kubernetes/CHANGELOG-1.17.md at master · kubernetes/kubernetes · GitHub

安装docker

在3个master节点,2个node节点都安装

安装必要的⼀些系统⼯具
# sudo apt-get update
# apt -y install apt-transport-https ca-certificates curl software-properties-common

安装GPG证书
# curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

写⼊软件源信息
# sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

更新软件源
# apt-get -y update

查看可安装的Docker版本
# apt-cache madison docker-ce docker-ce-cli

安装并启动docker 19.03.8:
# apt install -y docker-ce=5:19.03.15~3-0~ubuntu-bionic docker-ce-cli=5:19.03.15~3-0~ubuntu-bionic
# systemctl start docker && systemctl enable docker

验证docker版本:
# docker version

所有节点安装kubelet kubeadm kubectl

  • kubectl :命令行工具

  • kube-proxy :网络代理

  • kubeadm :部署k8s的工具

  • kubelet :容器创建,网络

所有节点配置阿⾥云仓库地址并安装相关组件,node节点可选安装kubectl

配置阿⾥云镜像的kubernetes源(⽤于安装kubelet kubeadm kubectl命令)

https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.13651102.0.0.3e221b11Otippu

阿⾥的kubernetes镜像源
# apt-get update && apt-get install -y apt-transport-https
# curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
# cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

#二选一

使⽤清华的kubernetes镜像源
# apt-get update && apt-get install -y apt-transport-https
# curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
# echo "deb https://mirrors.tuna.tsinghua.edu.cn/kubernetes/apt kubernetes-xenial main" >> /etc/apt/sources.list.d/kubernetes.list

安装kubeadm

# apt-get update

查看版本
# apt-cache madison kubeadm

master节点上安装
# apt-get -y install kubelet=1.20.5-00 kubeadm=1.20.5-00 kubectl=1.20.5-00
node节点上安装
# apt-get install kubelet=1.20.5-00 kubeadm=1.20.5-00

验证版本
# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.5", GitCommit:"6b1d87acf3c8253c123756b9e61dac642678305f", GitTreeState:"clean", BuildDate:"2021-03-18T01:08:27Z", GoVersion:"go1.15.8", Compiler:"gc", Platform:"linux/amd64"}

准备镜像

root@master:~ # kubeadm config images list --kubernetes-version v1.20.5
k8s.gcr.io/kube-apiserver:v1.20.5
k8s.gcr.io/kube-controller-manager:v1.20.5
k8s.gcr.io/kube-scheduler:v1.20.5
k8s.gcr.io/kube-proxy:v1.20.5
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.13-0
k8s.gcr.io/coredns:1.7.0

master节点下载镜像

建议提前在所有master节点下载镜像以减少安装等待时间,但是镜像默认使⽤Google的镜像仓库,所以国内 ⽆法直接下载,但是可以通过阿⾥云的镜像仓库把镜像先提前下载下来,可以避免后期因镜像下载异常 ⽽导致k8s部署异常。

root@master:~ # vim images-download.sh
#!/bin/bash                                                                          
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.20.5
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.20.5
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.20.5
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.20.5
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.13-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.7.0


#执行脚本下载镜像
# bash images-download.sh

验证当前镜像

root@master:~ # docker images
REPOSITORY                                                                    TAG                 IMAGE ID            CREATED             SIZE
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy                v1.20.5             5384b1650507        5 weeks ago         118MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager   v1.20.5             6f0c3da8c99e        5 weeks ago         116MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler            v1.20.5             8d13f1db8bfb        5 weeks ago         47.3MB
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver            v1.20.5             d7e24aeb3b10        5 weeks ago         122MB
registry.cn-hangzhou.aliyuncs.com/google_containers/etcd                      3.4.13-0            0369cf4303ff        8 months ago        253MB
registry.cn-hangzhou.aliyuncs.com/google_containers/coredns                   1.7.0               bfe3a36ebd25        10 months ago       45.2MB
registry.cn-hangzhou.aliyuncs.com/google_containers/pause                     3.2                 80d28bedfe5d        14 months ago       683kB

kubectl 命令

$ yum install -y bash-completion
$ vim /root/.bash_profile
#添加以下两行到.bash_profile文件中
. /usr/share/bash-completion/bash_completion
. <(kubectl completion bash)

$ echo "source <(kubectl completion bash)" >> ~/.bashrc

退出重新连接shell
exit
kubectl --help   #查询帮助文档
kubectl create namespace yunwei  #创建namespace名为yunwei
kubectl create -f nginx-deployment.yaml #以yaml文件创建nginx

 

kubectl get deploy  #查询到deploy

kubectl get deploy/web -o yaml --export > first_deploy.yml  #将此web的deploy以yml文件的格式导出到  first_deploy.yml文件


scale  增加副本数
autoscale   利用率 自动缩放
certificate  证书
cluster-info  集群信息
top #看节点的利用率
cordon   #将节点设置为不可调度
uncordon   #将节点设置为调度


kubectl labels    #修改标签
kubectl annotate --help #注释
kubectl api-versions  #查看api版本
kubectl version  #查看 软件版本

kubectl api-resources   #查看命令缩写


#创建:(以命令展示,后续在上yaml)
kubectl run nginx --replicas=3 --labels='app=nginx' --image=nginx:1.10 --port=80   #命令创建,名字nginx,副本3,标签nginx,镜像nginx1.10,端口80

#查看:
kubectl get namespace  #查看所有命名空间
kubectl get all   #查看pod, service,deployment,replicaset资源
kubectl get pod  #查看已有的pod节点
kubectl get node   #查看已有的node节点
kubectl get svc   #查看集群信息
kubectl get svc nginx-service  #指定集群名查看集群信息
kubectl get pod -o wide  #显示所在node,IP等信息
kubectl get deploy   #查看是deploy的资源类型
kubectl get pods --show-labels  #查询所有的pod和标签
kubectl get pods -l app=nginx  #指定标签查询pod
kubectl get ep 		#查看service转发的duan

#发布:
kubectl expose deployment nginx --port=88 --target-port=80 --type=NodePort --name=nginx  #指定deployment资源类型,nginx集群,集群的端口88,容器的端口80,NodePort类型 , 发布的名字nginx


故障排查
kubectl describe pod/nginx-7cccd4bdff-9d797 #pod信息,和详细事件
kubectl logs pod/nginx-7cccd4bdff-9d797  #通过logs查看pod的日志
kubectl exec -it nginx-7cccd4bdff-9d797 bash #通过exec 进入pod容器的 bash控制台


#查看详细集群的信息
kubectl describe service nginx
kubectl describe  pod nginx-fc9768844-8kg84

#更新
kubectl set image deployment/nginx nginx=nginx:1.11 --record=true  #更新deployment/nginx 标签,更新改变的信息,并记录

kubectl edit deploy/nginx   #编辑deploy/nginx这个资源把nginx的image 修成1.12版本
kubectl get all  #查询到所有pod
kubectl describe  pod/nginx-fc9768844-8kg84  #找到nginx的资源查看详情


#资源发布管理
kubectl rollout status deploy/nginx  #查询状态
kubectl rollout history deploy/nginx #查看变更历史

kubectl scale deploy/nginx --replicas=5  #扩容副本数为5个
kubectl scale deploy/nginx --replicas=3  #缩容副本数为3个

#回滚
kubectl rollout undo deployment/nginx   #回滚到上个版本
kubectl rollout undo deployment/nginx --revision=3 #回滚到第三个版本


#删除
kubectl delete service/nginx    	#删除service
kubectl delete deployment.apps/nginx   #删除deployment

在三台master中任意⼀台master 进⾏集群初始化,而且集群初始化只需要初始化⼀次。

kubeadm init

kubeadm命令

https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/ #命令选项及帮助

# kubeadm --help
Available Commands:
 alpha 			#kubeadm处于测试阶段的命令
 completion 	#bash命令补全,需要安装bash-completion

配置命令补全
 # mkdir /data/scripts -p
 # kubeadm completion bash > /data/scripts/kubeadm_completion.sh
 # source /data/scripts/kubeadm_completion.sh
 # vim /etc/profile
 source /data/scripts/kubeadm_completion.sh
 
 config 		#管理kubeadm集群的配置,该配置保留在集群的ConfigMap中
 #kubeadm config print init-defaults
 
 help 			Help about any command
 init 			#初始化⼀个Kubernetes控制平⾯
 join 			#将节点加⼊到已经存在的k8s master
 reset 			#还原使⽤kubeadm init或者kubeadm join对系统产⽣的环境变化
 
 token #管理token
 upgrade #升级k8s版本
 version #查看版本信息

单节点初始化

apiserver-advertise-address=172.24.188.160 #master IP

# kubeadm init --apiserver-advertise-address=172.24.188.160 --apiserver-bind-port=6443 --kubernetes-version=v1.20.5 --pod-network-cidr=10.100.0.0/16 --service-cidr=10.200.0.0/16 --service-dns-domain=zxx.local --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --ignore-preflight-errors=swap


#	保存token
kubeadm join 172.24.188.160:6443 --token nyq0o2.e39c8e4qgvcqa0p3 \
    --discovery-token-ca-cert-hash sha256:c140feccb4f3aee66ecbed39edf22a4ed0c296779852635848c9b7e0700be4f0
2台node都加
# kubeadm join 10.0.0.100:6443 --token qcow5v.6w83b8j4hfywk0pi \ --discovery-token-ca-cert-hash sha256:c4432d13eab0640878d205be71d222d99af8eb8c96b1c3bd032339427fa2204f

配置kube-config文件及网络组件

⽆论使⽤命令还是⽂件初始化的k8s环境,⽆论是单机还是集群,需要配置⼀下kube-config⽂件及⽹络 组件

kube-config⽂件

Kube-config⽂件中包含kube-apiserver地址及相关认证信息

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

root@master1:~ # kubectl get node
NAME      STATUS     ROLES                  AGE   VERSION
master1   NotReady   control-plane,master   18m   v1.20.5

部署⽹络组件flannel:
root@master1:~ # wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

###必须查看修改###
root@master1:~ # vim kube-flannel.yml  
  net-conf.json: |
    {
      "Network": "10.100.0.0/16",          注意:!!!#修改成初始化定义得网段
      "Backend": {
        "Type": "vxlan"
      }                                                                                                     

root@master1:~ # kubectl apply -f kube-flannel.yml

验证master节点状态(需要多刷新几次)
root@master1:~ # kubectl get node
NAME      STATUS   ROLES                  AGE   VERSION
master1   Ready    control-plane,master   38m   v1.20.5

部署dashboard

版本:v2.2.0

https://github.com/kubernetes/dashboard

下载配置文件上传镜像

#如不行用迅雷下载,再上传
root@master1:~ # wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.2.0/aio/deploy/recommended.yaml
root@master1:~ # mv dashboard-2.2.4.yaml dashboard-2.2.0.yaml 

下载配置文件中的 两个镜像
root@master1:~ # docker pull kubernetesui/dashboard:v2.2.0
root@master1:~ # docker pull kubernetesui/metrics-scraper:v1.0.6

打标签
# docker tag kubernetesui/metrics-scraper 10.0.0.12:8009/zxx/kub-metrics
# docker tag kubernetesui/metrics-scraper:v1.0.6 10.0.0.12:8009/zxx/kub-metrics:v2.2.0
上传到harbor
# docker push 10.0.0.12:8009/zxx/kub-metrics:latest
# docker push 10.0.0.12:8009/zxx/dashboard:v2.2.0

修改配置文件内容

root@master1:~ # vim dashboard-2.2.0.yaml
spec:
  type: NodePort			#增加(注意大小写)
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 32002          #增加(注意大小写)  

#查询/image修改两个地方
containers:
        - name: kubernetes-dashboard
          image: 10.0.0.12:8009/zxx/dashboard:v2.2.0	#修改为harbor

containers:
        - name: dashboard-metrics-scraper
          image: 10.0.0.12:8009/zxx/kub-metrics:latest	#修改为harbor


root@master1:~ # kubectl apply -f dashboard-2.2.0.yaml
      
检查端口
root@master1:~ # ss -ntl
LISTEN 0       128              0.0.0.0:32002          0.0.0.0:*

访问dashboard

所有master,node节点ip都可以访问

访问: https://10.0.0.13:32002/

获取登录token

创建用户

root@master1:~ # vim admin-user.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding                                       
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard

获取密钥

将tokne:下的内容复制到登录界面里即可

root@master1:~ # kubectl get secret -A | grep admin
kubernetes-dashboard   admin-user-token-qrwtx                         kubernetes.io/service-account-token   3      29s


root@master1:~ # kubectl describe secrets admin-user-token-qrwtx -n kubernetes-dashboard

token:      eyJhbGciOiJSUzI1NiIsImtpZCI6ImNNMjYtanB4VWs1S2hNRGdnMlV0OWJhSDl4QWxOVFZjNU9VaFNsa1I1S3MifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXFyd3R4Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI1ODVkMWY3My03ZTEwLTRkNzgtOWNiMS0xZTM1NTVjZGM3Y2EiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.y8YKQRmNAf7vRvaPNxkyCq4C-rn0nvtEpkhGD1RwjAY7xKb39VTH99hCsjsbOCkGzRrBV_8agOJO-UTP06-RhNC0hCkuIgSydIsQqn2vKraUli_uOPHlXZISRoEN_MqL4QtCyvuxtdE-I5VMrScmZqMqpbZFYYuDkkFO_VywH_L9AiAYbduBtbWTuqNafrrtGdFNrUz_2G7f0UD-id21Hp4nV8np-maWvxfUzOSNdwLLoQvZsGEAZLxKTw-tidytg6VEnZZWHg3EnPBVS20ed7AjiLKmF1dpSmpeiL2gtNnRlUzU2NQrnUEjjL3_RFw_7Pp9M3NW6Os2JGpyWeOv5A
⚠️ **GitHub.com Fallback** ⚠️