云原生的代表技术包括:

                  • 容器
                  • 服务网格
                  • 微服务
                  • 不可变基础设施
                  • 声明式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”。 在 matchLabelsmatchExpressions 中给出的所有条件都必须满足才能匹配。

  • template
    

    字段包含以下子字段:

    • Pod 被使用 .metadata.labels 字段打上 app: nginx 标签。
    • Pod 模板规约(即 .template.spec 字段)指示 Pod 运行一个 nginx 容器, 该容器运行版本为 1.14.2 的 nginx Docker Hub 镜像。
    • 创建一个容器并使用 .spec.template.spec.containers[0].name 字段将其命名为 nginx

测试:

# 启动
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