云原生的代表技术包括:
-
-
-
-
-
-
-
-
- 容器
- 服务网格
- 微服务
- 不可变基础设施
- 声明式API
-
-
-
-
-
-
-
管理对象
- 命令行指令
例如,使用kubectl
命令来创建和管理 Kubernetes 对象。
命令行就好比口头传达,简单、快速、高效。
但它功能有限,不适合复杂场景,操作不容易追溯,多用于开发和调试。
- 声明式配置
kubernetes使用yaml文件来描述 Kubernetes 对象。
声明式配置就好比申请表,学习难度大且配置麻烦。
好处是操作留痕,适合操作复杂的对象,多用于生产。
常用命令缩写
名称 | 命令行缩写 | Kind | 解释 |
---|---|---|---|
namespaces | ns | Namespace | 命名空间 |
nodes | no | Node | 节点 |
pods | po | Pod | Pod |
services | svc | Service | 服务 |
deployments | deploy | Deployment | 部署 |
replicasets | rs | ReplicaSet | 副本数量 |
statefulsets | sts | StatefulSet | 有状态应用集 |
YAML规范
-
- 缩进代表上下级关系
- 缩进时不允许使用Tab键,只允许使用空格,通常缩进2个空格
**:**
键值对,后面必须有空格**-**
列表,后面必须有空格**[ ]**
数组**#**
注释**|**
多行文本块**---**
表示文档的开始,多用于分割多个资源对象
-
group: name: group-1 members: # 列表 - name: "Jack Ma" UID: 10001 - name: "Lei Jun" UID: 10002 words: # 数组 ["I don't care money","R U OK"] # comments text: | # 多行文本 line new line 3rd line
-
配置对象
-
在创建的 Kubernetes 对象所对应的 yaml文件中,需要配置的字段如下:
-
●apiVersion - Kubernetes API 的版本
-
●kind - 对象类别,例如Pod、Deployment、Service、ReplicaSet、Job等
-
●metadata - 描述对象的元数据,包括一个 name 字符串、UID 和可选的 namespace
-
●spec - 对象的配置
-
Pod例子:
-
apiVersion: v1 # 声明api 版本 kind: Pod # 类别为 Pod metadata: # 描述对象,Pod名称 name: nginx-mek spec: # 对象的配置 containers: - name: nginx # 容器名称 image: nginx:1.14.2 # 镜像版本 ports: - containerPort: 80 # 容器内暴露端口
-
测试:
-
root@master:~/Woker# kubectl apply -f nginx-mek.yaml pod/nginx-mek created root@master:~/Woker# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-mek 1/1 Running 0 2m55s 10.244.2.26 node2
-
进入容器:
-
root@master:~/Woker# kubectl exec -it nginx-mek -- sh # uname -a Linux nginx-mek 5.15.0-52-generic #58-Ubuntu SMP Thu Oct 13 08:03:55 UTC 2022 x86_64 GNU/Linux # exit # 退出
-
下面的示例是一个简单的 Job :
-
apiVersion: batch/v1 kind: Job # 单次任务 metadata: name: myJob spec: template: # 这里是 Pod 模板 spec: containers: - name: hello image: busybox:1.28 command: ['sh', '-c', 'echo "Hello, Kubernetes!" && sleep 10'] restartPolicy: OnFailure # 以上为 Pod 模板
-
测试:
-
root@master:~/Woker# kubectl apply -f myJob.yaml job.batch/myjob unchanged root@master:~/Woker# kubectl get pod -A -o wide NAMESPACE NAME READY STATUS RESTARTS AGE default myjob-9t7hj 0/1 Completed 0 90s root@master:~/Woker# kubectl logs myjob-9t7hj Hello, Kubernetes! root@master:~/Woker#
-
掌握程度:
■不要求自己会写
■找模版
■能看懂
■会修改
■能排错
标签
标签(Labels) 是附加到 Kubernetes 对象(比如 Pod)上的键值对。 标签旨在用于指定对用户有意义且相关的对象的标识属性,但不直接对核心系统有语义含义。 标签可以用于组织和选择对象的子集。标签可以在创建时附加到对象,随后可以随时添加和修改。 每个对象都可以定义一组键/值标签。每个键对于给定对象必须是唯一的。
标签需要声明在metadata里面:
"metadata": {
"labels": {
"key1" : "value1",
"key2" : "value2"
}
}
标签能够支持高效的查询和监听操作,对于用户界面和命令行是很理想的。 应使用注解记录非识别信息。
-
键的格式:
-
- 前缀(可选)/名称(必须)。
-
有效名称和值:
-
- 必须为 63 个字符或更少(可以为空)
- 如果不为空,必须以字母数字字符([a-z0-9A-Z])开头和结尾
- 包含破折号
**-**
、下划线**_**
、点**.**
和字母或数字
apiVersion: v1
kind: Pod
metadata:
name: label-demo
labels:
environment: text
app: nginx
op: mek
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
可以通过-l 指定标签查找pod,多个标签用逗号隔开,多个标签为and关系.
root@master:~/Woker# kubectl get po -l op=mek,app=nginx # 通过-l 指定标签
NAME READY STATUS RESTARTS AGE
label-demo 1/1 Running 0 19h
root@master:~/Woker#
选择器
标签选择器 可以识别一组对象。标签不支持唯一性。
标签选择器最常见的用法是为Service选择一组Pod作为后端。
Service示例: 关联上面的nginx例子
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort
selector: # 设置选择条件指定目标Pod
environment: text
app: nginx
op: mek
ports:
# 默认情况下,为了方便起见,`targetPort` 被设置为与 `port` 字段相同的值。
- port: 80 # port 集群间访问端口
targetPort: 80 # targetPort 容器内端口
# 可选字段
# 默认情况下,为了方便起见,Kubernetes 控制平面会从某个范围内分配一个端口号(默认:30000-32767)
nodePort: 30080 # nodePort 物理节点上的端口
测试:
root@master:~/Woker# kubectl apply -f nginx-service-NodePort.yaml
service/nginx-service created
root@master:~/Woker# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 57d
nginx-service NodePort 10.97.195.150 <none> 80:30080/TCP 21s
# 验证外网端口
root@master:~/Woker# curl 192.168.200.31:30080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
创建 Deployment
下面是一个 Deployment 示例。其中创建了一个 ReplicaSet,负责启动三个 nginx
Pod:
apiVersion: apps/v1 # 指定api版本
kind: Deployment # 定义类型为Deployment
metadata: # 设置Pod元数据
name: nginx-deployment
labels: # 设置标签
app: nginx
spec: # 设置Pod规则
replicas: 3 # 设置副本数量
selector:
matchLabels: # 通过标签绑定
app: nginx
template: # 设置副本的标签
metadata:
labels:
app: nginx
spec: # 设置容器规则
containers:
- name: nginx
image: nginx:1.14.2 # 指定镜像
ports:
- containerPort: 80 # 开发容器内端口
在该例中:
-
创建名为
nginx-deployment
(由.metadata.name
字段标明)的 Deployment。 该名称将成为后续创建 ReplicaSet 和 Pod 的命名基础。 参阅编写 Deployment 规约获取更多详细信息。 -
该 Deployment 创建一个 ReplicaSet,它创建三个(由
.spec.replicas
字段标明)Pod 副本。 -
.spec.selector
字段定义所创建的 ReplicaSet 如何查找要管理的 Pod。 在这里,你选择在 Pod 模板中定义的标签(app: nginx
)。 不过,更复杂的选择规则是也可能的,只要 Pod 模板本身满足所给规则即可。说明:
spec.selector.matchLabels
字段是{key,value}
键值对映射。 在matchLabels
映射中的每个{key,value}
映射等效于matchExpressions
中的一个元素, 即其key
字段是 “key”,operator
为 “In”,values
数组仅包含 “value”。 在matchLabels
和matchExpressions
中给出的所有条件都必须满足才能匹配。 -
template
字段包含以下子字段:
- Pod 被使用
.metadata.labels
字段打上app: nginx
标签。 - Pod 模板规约(即
.template.spec
字段)指示 Pod 运行一个nginx
容器, 该容器运行版本为 1.14.2 的nginx
Docker Hub 镜像。 - 创建一个容器并使用
.spec.template.spec.containers[0].name
字段将其命名为nginx
。
- Pod 被使用
测试:
# 启动
root@master:~/Woker# kubectl apply -f Deployment-nginx.yaml
deployment.apps/nginx-deployment created
# 验证
root@master:~/Woker# kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP
nginx-deployment-7fb96c846b-4xkwq 1/1 Running 0 25s 10.244.1.27
nginx-deployment-7fb96c846b-pgznw 1/1 Running 0 25s 10.244.2.30
nginx-deployment-7fb96c846b-xmk4m 1/1 Running 0 25s 10.244.2.31
完整的YAML示例
一个简单的包含Deploymenth和Namespace和Service的示例:
apiVersion: v1
# 创建命名空间
kind: Namespace
metadata:
name: nginx
---
# 多个资源用 --- 分割表示多个yaml文件拼接
apiVersion: apps/v1
# 创建Deployment
kind: Deployment
metadata:
name: nginx-deployment-v1
# 指定该Deployment所属命名空间
namespace: nginx
labels:
app: nginx-deployment-v1
spec:
# 设置副本数量
replicas: 3
selector:
matchLabels: # 跟template.metadata.labels一致
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.22
ports:
- containerPort: 80
---
apiVersion: v1
# 创建 Service
kind: Service
metadata:
name: canary-demo
# 指定该Service所属命名空间
namespace: nginx
spec:
type: NodePort
selector: # 更Deployment中的selector一致
app: nginx
ports:
- port: 80
targetPort: 80
nodePort: 30010
测试:
# 启动
kubectl apply -f 1.yaml
namespace/nginx created
deployment.apps/nginx-deployment-v1 created
service/canary-demo created
# 查看Pod 通过-n 指定命名空间
root@master:~/Woker# kubectl get po -n nginx
NAME READY STATUS RESTARTS AGE
nginx-deployment-v1-645549fcf7-cnmgr 1/1 Running 0 24s
nginx-deployment-v1-645549fcf7-dd2sf 1/1 Running 0 24s
nginx-deployment-v1-645549fcf7-g7l8r 1/1 Running 0 24s
nginx-deployment-v1-645549fcf7-hfdt9 1/1 Running 0 24s
nginx-deployment-v1-645549fcf7-kkpqk 1/1 Running 0 24s
nginx-deployment-v1-645549fcf7-kwkjt 1/1 Running 0 24s
nginx-deployment-v1-645549fcf7-lxqqc 1/1 Running 0 24s
nginx-deployment-v1-645549fcf7-q9pfd 1/1 Running 0 24s
nginx-deployment-v1-645549fcf7-xfptd 1/1 Running 0 24s
nginx-deployment-v1-645549fcf7-z8szf 1/1 Running 0 24s
# 查看Service
root@master:~/Woker# kubectl get svc -n nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
canary-demo NodePort 10.97.65.161 <none> 80:30010/TCP 44s