基本概念

云计算就是一种配置资源的方式,大概分为三种类型:

  • IaaS: Infrastructure as a Service
  • PaaS: Platform as a Service
  • SaaS: Software as a Service

K8s 架构

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

安装配置

基于 MacOS docker desktop 安装时,直接配置项中启用 Kubernetes 即可;

安装配置

安装 k8s dashboard

1
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.4/aio/deploy/recommended.yaml

开启 dashboard

1
$ kubectl proxy

浏览器访问 dashboard 访问地址如下:

http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

需要生成 token 来进入界面,命令如下,输入最后生成的token

1
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')

参考文档:kubernetes/dashboard

基本命令

  • 类似 docker run

    1
    $ kubectl run --image=nginx nginx-app --port=80 --env="DOMAIN=cluster"
  • 类似 docker ps

    1
    $ kubectl get po
  • 类似 docker exec

    1
    $ kubectl exec -it nginx-app-5jyvm(name) -- /bin/bash
  • 类似 docker rmi

    1
    $ kubectl delete deployment nginx-app(name)
  • 查看 pod 相关信息:

    1
    $ kubectl describe pods aiops-tracerca-9cc566cf5-6jxvr(full-name)
  • 查看 k8s 支持的所有API资源

    1
    $ kubectl api-resources -o wide
    API 资源
    • NAME 资源名称
    • SHORTNAMES 资源名称简写
    • APIGROUP => apiVersion
    • KIND 资源类型
    • VERBS 可用的方法
  • 通过制定api-group参数来获取特定 API 组的 API 资源:

    1
    $ api-resources --api-group apps -o wide
    API 组资源
  • 查看资源的相关信息(将会显示资源及其对应的 yaml 文件版本):

    1
    $ kubectl explain deployments
    资源信息
  • 获取集群支持的所有API版本:

    1
    $ kubectl api-versions

yaml 文件解析

deployments yaml 解析:

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
apiVersion: apps/v1  # 指定api版本,此值必须在kubectl api-versions中  
kind: Deployment # 指定创建资源的角色/类型
metadata: # 资源的元数据/属性
name: demo # 资源的名字,在同一个namespace中必须唯一
namespace: default # 部署在哪个namespace中
labels: # 设定资源的标签
app: demo
version: stable
spec: # 资源规范字段
replicas: 1 # 声明副本数目
revisionHistoryLimit: 3 # 保留历史版本
selector: # 选择器
matchLabels: # 匹配标签
app: demo
version: stable
strategy: # 策略
rollingUpdate: # 滚动更新
maxSurge: 30% # 最大额外可以存在的副本数,可以为百分比,也可以为整数
maxUnavailable: 30% # 示在更新过程中能够进入不可用状态的 Pod 的最大值,可以为百分比,也可以为整数
type: RollingUpdate # 滚动更新策略
template: # 模版
metadata: # 资源的元数据/属性
annotations: # 自定义注解列表
sidecar.istio.io/inject: "false" # 自定义注解名字
labels: # 设定资源的标签
app: demo
version: stable
spec: # 资源规范字段
containers:
- name: demo # 容器的名字
image: demo:v1 # 容器使用的镜像地址
imagePullPolicy: IfNotPresent # 每次Pod启动拉取镜像策略,三个选择 Always、Never、IfNotPresent
# Always,每次都检查;Never,每次都不检查(不管本地是否有);IfNotPresent,如果本地有就不检查,如果没有就拉取
resources: # 资源管理
limits: # 最大使用
cpu: 300m # CPU,1核心 = 1000m
memory: 500Mi # 内存,1G = 1000Mi
requests: # 容器运行时,最低资源需求,也就是说最少需要多少资源容器才能正常运行
cpu: 100m
memory: 100Mi
livenessProbe: # pod 内部健康检查的设置
httpGet: # 通过httpget检查健康,返回200-399之间,则认为容器正常
path: /healthCheck # URI地址
port: 8080 # 端口
scheme: HTTP # 协议
# host: 127.0.0.1 # 主机地址
initialDelaySeconds: 30 # 表明第一次检测在容器启动后多长时间后开始
timeoutSeconds: 5 # 检测的超时时间
periodSeconds: 30 # 检查间隔时间
successThreshold: 1 # 成功门槛
failureThreshold: 5 # 失败门槛,连接失败5次,pod杀掉,重启一个新的pod
readinessProbe: # Pod 准备服务健康检查设置
httpGet:
path: /healthCheck
port: 8080
scheme: HTTP
initialDelaySeconds: 30
timeoutSeconds: 5
periodSeconds: 10
successThreshold: 1
failureThreshold: 5
#也可以用这种方法
#exec: 执行命令的方法进行监测,如果其退出码不为0,则认为容器正常
# command:
# - cat
# - /tmp/health
#也可以用这种方法
#tcpSocket: # 通过tcpSocket检查健康
# port: number
ports:
- name: http # 名称
containerPort: 8080 # 容器开发对外的端口
protocol: TCP # 协议
imagePullSecrets: # 镜像仓库拉取密钥
- name: harbor-certification
affinity: # 亲和性调试
nodeAffinity: # 节点亲和力
requiredDuringSchedulingIgnoredDuringExecution: # pod 必须部署到满足条件的节点上
nodeSelectorTerms: # 节点满足任何一个条件就可以
- matchExpressions: # 有多个选项,则只有同时满足这些逻辑选项的节点才能运行 pod
- key: beta.kubernetes.io/arch
operator: In
values:
- amd64

service yaml 解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: v1 # 指定api版本,此值必须在kubectl api-versions中 
kind: Service # 指定创建资源的角色/类型
metadata: # 资源的元数据/属性
name: demo # 资源的名字,在同一个namespace中必须唯一
namespace: default # 部署在哪个namespace中
labels: # 设定资源的标签
app: demo
spec: # 资源规范字段
type: ClusterIP # ClusterIP 类型
ports:
- port: 8080 # service 端口
targetPort: http # 容器暴露的端口
protocol: TCP # 协议
name: http # 端口名称
selector: # 选择器
app: demo

常见问题

  1. pod 报错:“Back-off restarting failed container” 解决办法

deployment申明镜像的后面加上命令,原因是镜像中没有默认运行command;

command: [ "/bin/bash", "-ce", "tail -f /dev/null" ]

  1. pod 报错: Error : FailedScheduling : nodes didn’t match node selector

删除 nodeSelector: 配置项

  1. pod 报错:Error: ImagePullBackOff

设置 deployment.yaml 文件

1
2
3
imagePullPolicy: Never # 不从远程 pull
imagePullPolicy: Always # 从远程 pull
imagePullPolicy: IfNotPresent # 本地不存在从远程 pull
  1. pod 报错:Readiness probe failed: dial tcp 10.1.0.17:8080: connect: connection refused