Kubernetes 学习笔记

记录了从 0 开始学习 Kubernetes 的知识点,学习资料等,长期更新中

学习资料

The Illustrated Children’s Guide to Kubernetes 面向小朋友的 k8s 基本讲解,通俗易懂,适用于纯小白了解

The difference between docker and Kubernetes reddit 讨论,有些答案通俗易懂,适用于纯小白入门了解

Kubernetes Crash Course for Absolute Beginners [NEW] 1 小时课程,初步了解 k8s 的构成,接下来可以看看 Nana 的 4 小时课程及官方文档

初识 K8s

Kubernetes 简介

  1. 开源容器编排
  2. google 开发的
  3. 提供任意环境,包括物理环境、云、虚拟环境等

解决什么问题

  1. 从单服务到微服务转变的过程中,对多容器运行管理的需求变高
  2. 管理成千上万的容器

提供什么能力

  • 高可用(不会 downtime),always accessible by users
  • 可扩展(scalability)高性能
  • 容灾恢复(disaster recovery)- backup and store, will not lose data

架构

Node:

  • master node (control panel): much more important, always have backup
  • Work node: much bigger and more resource

kubernetes diagram

组件 Components

image-20250215141501458

Pod:

  • k8s 中的最小单元
  • 代表容器
  • 通常一个 pod 代表一个应用,比如 1 个 docker
  • 每个 pod 都有自己的 ip 地址
  • pod 可以很容易被替换,新的 pod 会被分配新的 ip

Service

  • 用于通信

  • 永久性的静态 ip 地址,

  • 即使 pod die,service ip address 不变

  • 分为 external service (比如应用) 和 internal service (default type)(比如数据库)

Ingress:

  • route traffic to cluster,路由分配

ConfigMap:

  • 可以从外部配置 pod 数据,比如修改数据库名称或者 url
  • 只放一些不用于机密的数据

sercet

  • 存储一些加密数据
  • 环境变量

volumn

  • 保证数据持久化,即使 db 挂掉重新加载也不会丢失
  • 本地存储或者远程比如云存储

Deployment:

  • 复制 app,防止挂掉

statefulset

  • 复制 DB

image-20250215150340569

创建 configuration file

  • metadata
  • spec
  • Status: 由 k8s 自动生成,来源于 etcd(etcd holds the current status of any k8s component)
1
2
3
4
5
6
apiVersion: v1
kind: Deployment/Servie
metadata:
name:ngix-deployment
spec:

Minikube and Kubectl

Minikube:一个 node 包含 master node process 和 work node process,这个 node 预装了 docker,因此可以在这个 node 跑容器

Kubectl:commend line tool for k8s cluster,可以用来创建、删除 pod,执行 node 等

安装

1
2
3
4
5
6
brew install minikube #同时也装上了kubectl
# 安装docker,假设已经装好了
minikube start --driver docker
minikube status

kubectl get node

创建文件

image-20250215165607535

四个文件

  • Mongo-config.yaml,官网搜索 configmap 查询写法
1
2
3
4
5
6
apiVersion: v1
kind: ConfigMap
metadata:
name: mongo-config
data:
mongo-url: mongo-service #服务名,在 mongo.yaml 中定义
  • Mongo-secret.yaml,官网搜索 sercet 查询写法

encode 方式:terminal 运行echo -n name | base64 即可得到 bW9uZ291c2Vy

1
2
3
4
5
6
7
8
apiVersion: v1
kind: Secret
metadata:
name: mongo-secret
type: Opaque
data:
mongo-user: bW9uZ291c2V #使用 echo 加密
mongo-password: bW9uZ29wYXNzd29yZA==
  • Mongo.yaml,官网搜索 deployment 查询写法,包含 deployment 和 service

Requestport:8080 –> Mongo ServicetargetPort:27017 –> 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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
apiVersion: apps/v1
kind: Deployment
metadata:
name: mongo-deployment
labels:
app: mongo
spec:
replicas: 1 #创建 pod 的个数
selector:
matchLabels: #用来确保这 pod 用于这个 deployment
app: mongo
template:
metadata:
labels:
app: mongo
spec:
containers:
- name: mongodb
image: mongo:5.0 # 查 dockerhub 官网看 tag
ports:
- containerPort: 27017 # 查 dockerhub 官网看端口
env: # 数据库登陆调用环境变量
- name: MONGO_INITDB_ROOT_USERNAME # 数据库用户名,dockerhub 官网找
valueFrom:
secretKeyRef: # 这个 yaml 会去 secret 文件中找数据库用户名并赋值给 MONGO_INITDB_ROOT_USERNAME
name: mongo-secret
key: mongo-user
- name: MONGO_INITDB_ROOT_PASSWORD # 数据库密码,dockerhub 官网找
valueFrom:
secretKeyRef: # 这个 yaml 会去 secret 文件中找数据库密码并赋值给 MONGO_INITDB_ROOT_PASSWORD
name: mongo-secret
key: mongo-password
---
apiVersion: v1
kind: Service
metadata:
name: mongo-service
spec:
selector:
app: mongo
ports:
- protocol: TCP
port: 8080 # service 自己的 port,也可以于 targetport 相同,更简单
targetPort: 27017 # container 的 port

webapp.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
apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp-deployment
labels:
app: webapp
spec:
replicas: 1 # 创建 pod 的个数
selector:
matchLabels: # 用来确保这 pod 用于这个 deployment
app: webapp
template:
metadata:
labels:
app: webapp
spec:
containers:
- name: webapp
image: your-image-name:your-image-tag # 查 dockerhub 官网看 tag
ports:
- containerPort: your application port # eg node.js port is 3000
env:
- name: USER_NAME # 需要自己创建环境变量
valueFrom:
secretKeyRef: # 数据库名称
name: mongo-secret
key: mongo-user
- name: USER_PWD
valueFrom:
secretKeyRef: # 数据库密码
name: mongo-secret
key: mongo-password
- name: DB_URL
valueFrom:
configMapKeyRef: # 需要连接到数据库
name: mongo-config
key: mongo-url
---
apiVersion: v1
kind: Service
metadata:
name: webapp-service
spec:
type: NodePort # 默认是 ClusterIP,表示 Internal Service, NodePort 表示 external
selector:
app: webapp
ports:
- protocol: TCP
port: 3000 # service 自己的 port
targetPort: 3000 # container 的 port
nodePort: 30100 # 暴露给外部的端口,可以让 url 访问 Service,进而访问所有配置,范围是:30000-32767

在 minikube 运行

启动 minikube

1
2
minikube start --driver docker
minikube status

运行 yaml

1
2
3
4
kubectl apply -f mongo-config.yaml
kubectl apply -f mongo-secret.yaml
kubectl apply -f mongo.yaml
kubectl apply -f webapp.yaml

获取 node’s ip address

1
minikube ip

获取 k8s 组件基本信息

1
2
3
4
kubectl get node
kubectl get pod
kubectl get svc
kubectl get all

获取组件额外信息

1
2
kubectl get pod -o wide
kubectl get node -o wide

获取特定组件详细信息

1
2
kubectl describe svc {svc-name}
kubectl describe pod {pod-name}

获取 log

1
kubectl logs {pod-name}

关闭 Minikube cluster

1
minikube stop