🉑️s - Jommy328/Harbor GitHub Wiki
- 基于yaml⽂件实现容器的⾃动创建、删除
- 更快速实现业务的弹性横向扩容
- 动态发现新扩容的容器并对⾃动⽤户提供访问
- 更简单、更快速的实现业务代码升级和回滚
https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-apiserver/
- 提供了集群管理的REST API接口(包括认证授权、数据校验以及集群状态变更)
- 提供其他模块之间的数据交互和通信的枢纽(其他模块通过API Server查询或修改数据,只有API Server才直接操作etcd)
- 是资源配额控制的入口
https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-scheduler/
- Kubernetes的pod调度器,负责将Pods指派到合法的节点上
- 调度器之后对所有合法的节点进行排序,将 Pod 绑定到一个合适的节点
- 需要考虑独⽴的和集体的资源需 求、服务质量需求、硬件/软件/策略限制、亲和与反亲和规范等需求
https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-controller-manager/
-
集群内部的管理控制中⼼,负责集群内的Node、 Pod副本、服务端点(Endpoint)、命名空间(Namespace)、服务账号(ServiceAccount)、资源定额(ResourceQuota)的管理
-
当某个Node意外宕机时,会及时发现并执⾏⾃动 化修复流程,确保集群中的pod副本始终处于预期的⼯作状态
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服务访问。
https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kubelet/
- 运⾏在每个worker节点的代理组件,它会监视已分配给节点的pod
- 向master汇报node节点的状态信息
- 接受指令并在Pod中创建 docker容器
- 准备Pod所需的数据卷
- 返回pod的运⾏状态
- 在node节点执⾏容器健康检查
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:提供集群⽇志采集、存储与查询
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 |
在master和node节点安装kubeadm 、kubelet、kubectl、docker等组件,负载均衡服务器不需要安装。
在每个master节点和node节点安装docker
kubernetes/CHANGELOG-1.17.md at master · kubernetes/kubernetes · GitHub
在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
-
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节点下载镜像以减少安装等待时间,但是镜像默认使⽤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
$ 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
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
⽆论使⽤命令还是⽂件初始化的k8s环境,⽆论是单机还是集群,需要配置⼀下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
版本: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:*
所有master,node节点ip都可以访问
创建用户
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