K8s 实战(5) - 系统性理解 K8s 概念

核心概念和资源

K8s 资源类型: Pod, Deployment, Service, DaemonSet, ConfigMap, Secret, Ingress

K8s 其他核心概念: Node, Label, Container, Volume, Network(IP), Port, ReplicaSet, Namespace

  • Node 是工作节点, 包含 Kubelet(与主节点通信), Docker(Pod 程序运行) 两部分
  • Pod 是 多个 Container, 多个 Volume, 一个 IP 地址, 多个 Port 端口, 构建的服务单位, 每个 Pod 可以有多个 Label 标签, 用户分组选择.
  • ReplicaSet 是 多个相同 Pod 组成的复制集合, 构建的集群.
  • DevelopmentReplicaSet 的封装, 也是用于管理 Pod 集群的工具.
  • Service 是集群的网络抽象, 通过 Label 标签 和 Selector 选择器, 选择集群下的 Pod(一般 Deployment 创建 Pod 会将其打上标签). 因为 Development 下的 Pod 会经常变动, Service 在 Pod 变化后动态更新映射, 保证向外提供稳定的服务.
  • DaemonSet 是特殊的 Pod, 在指定 Node 运行(日志收集, 监控…).

Pod 名字: NAME-rand-rand, DeployName-RsName-PodName

创建 Pod

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
apiVersion: v1
kind: Pod
metadata:
name: redis
spec:
containers:
- name: redis
image: redis:latest
command:
- redis-server
- /etc/redis/redis.conf
ports:
- containerPort: 6379
resources:
limits:
cpu: '0.1'
volumeMounts:
- name: config
mountPath: /etc/redis
volumes:
- name: config
configMap:
name: redis-config
items:
- key: redis-config
path: redis.conf

创建 Deployment

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
apiVersion: apps/v1
kind: Deployment
metadata:
name: quant-bbo-deployment
labels:
app: quant-bbo
spec:
replicas: 3
selector:
matchLabels:
app: quant-bbo
template:
metadata:
labels:
app: quant-bbo
spec:
containers:
- name: quant-bbo
image: quant-bbo:latest
volumeMounts:
- name: config
mountPath: /quant-bbo/etc
volumes:
- name: config
configMap:
name: quant-bbo-4hc2dhhhg6

创建 Service

1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: Service
metadata:
name: redis-inner-service
spec:
selector:
app: redis
ports:
- protocol: TCP
port: 6379
targetPort: 6379

创建一个网络服务, 将 selector 指定的 pod 挂载进来. 服务 DNS 地址 redis-inner-service.default.svc.cluster.local. 端口映射为 cluster 端口 port 映射到 pod 端口 targetPort.

访问 pod 提供的服务使用: redis-inner-service.default.svc.cluster.local:port 即可.

创建 ConfigMap

使用命令

使用 create cm 创建 ConfigMap:

1
2
3
4
5
// 单文件创建
kubectl create cm nginx-config --from-file=http.conf=./http.conf

// 单文件更新
kubectl create cm nginx-config --from-file=http.conf=./http.conf -o yaml --dry-run | kubectl apply -f -

映射 ConfigMap 到 Pod 文件夹中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
spec:
containers:
- name: nginx
image: nginx:latest
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/nginx.d
volumes:
- name: nginx-config
configMap:
name: nginx-config
items:
- key: http.conf
path: https.conf

映射成功后, container 文件夹 /etc/nginx/nginx.d 中则有 https.conf (非 http.conf 因为做了 path 映射) 文件. 如果不写 items 选择性映射, 则所有内容全部映射.

使用模板

使用 kustomization.yml(必须是这个名字) 文件创建 ConfigMap:

1
2
3
4
configMapGenerator:
- name: nginx-config
files:
- http.conf

令配置生效 kubectl apply -k .

映射 ConfigMap 到 Pod 文件夹中:

1
2
3
4
5
6
7
8
9
10
11
spec:
containers:
- name: nginx
image: nginx:latest
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/nginx.d
volumes:
- name: nginx-config
configMap:
name: nginx-config-4hc2dhhhg6

映射思路为: name 为 nginx-config-4hc2dhhhg6 的 ConfigMap 作为 volume 加载进来, 加载后的名字为 nginx-config (volumes.name); 将 volume nginx-config (volumeMounts.name) 挂载到 container 中, 挂载位置为 /etc/nginx/nginx.d (volumeMounts.mountPath)

Note: 映射文件夹 /etc/nginx/nginx.d 必须是可写权限, 否则报错.

创建 Secret

1
2
3
4
5
kubectl create secret docker-registry XXX \
--docker-server=DOMAIN:5000 \
--docker-username=USERNAME \
--docker-password=PASSWORD \
--docker-email=EMAIL

这个 Secret 是用于调用外部私有 Registry 的授权, 参考 “K8s 实战(6) - 从私有 Registry 拉取镜像”

Donate - Support to make this site better.
捐助 - 支持我让我做得更好.