• 【k8s】使用k8s部署一个简单的nginx服务


    名词解释

    Namespace 表示命名空间

    Deployment 表示pod发布

    Service 表示多个pod做为一组的集合对外通过服务的表示

    kubectl 是k8s的命令行操作命令,可以创建和更新,删除,列表和查详情等一系列的操作

    部署步骤

    同样的方法将deployment改成service,可以实现对service的增删该查等操作。 

    一、创建命名空间namespace

    1. 创建命名空间的yaml文件 nginx-namespace.yaml

    apiVersion: v1
    kind: Namespace
    metadata:
      name: nginx
      labels:
        name: nginx

    配置说明:

    kind:Namespace 表示yaml文件创建的是命名空间

    metadata表示命名空间的元信息

    metadata.name 是命名空间的名称 取值nginx

    metadata.labels 是命名空间的标签 name=nginx

    2. 创建命名空间nginx

    kubectl create -f nginx-namespace.yaml

    3. 查询命名空间

    # 查询所有命名空间,可以看到新创建的命名空间nginx
    ➜  kube kubectl get namespaces
    NAME              STATUS   AGE
    default           Active   85d
    kube-node-lease   Active   85d
    kube-public       Active   85d
    kube-system       Active   85d
    nginx             Active   8d

    4. 查询命名空间nginx详情

    ➜  kube kubectl describe namespace nginx
    Name:         nginx
    Labels:       name=nginx
    Annotations:  <none>
    Status:       Active

    总结:

    从命名空间详情中可以看到如下信息

    命名空间名称: nginx

    命名空间的标签:name=nginx

    命名空间状态:Active 表示命名空间活跃

    二、创建nginx的发布Deployment

     1. 创建deployment的yaml文件 nginx-deployment.yaml

    ➜  kube cat nginx-deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: nginx
      name: nginx-deployment1
      namespace: nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - image: nginx:1.14.0
            ports:
            - containerPort: 80
            name: nginx
            volumeMounts:
            - name: conf
              mountPath: /etc/nginx/nginx.conf
            - name: log
              mountPath: /var/log/nginx
            - name: html
              mountPath: /etc/nginx/html
          tolerations:
          - key: "key"
            operator: "Equal"
            value: "nginx"
            effect: "NoSchedule"
          volumes:
          - name: conf
            hostPath:
              path: /Users/w/kube/nginx/conf/nginx.conf
          - name: log
            hostPath:
              path: /Users/w/kube/nginx/logs
              type: Directory
          - name: html
            hostPath:
              path: /Users/w/kube/nginx/html
              type: Directory
    

    配置说明:

    kind: Deployment表示yaml文件创建的是一个Deployment发布

    metadata表示这个deployment的元信息

    metadata.name 是deployment的名称 nginx-deployment1

    metadata.labels 是deployment的标签 即:app=nginx

    metadata.namespace  是deployment的命名空间,此处选择的是第一步创建的命名空间nginx

    spec: 表示deployment的详细参数配置说明

    spec.replicas 是启动几个pod节点

    spec.template.spec 是deployment选择模块的详细说明

    spec.template.spec.containers 表示选择的容器是什么,此处是nginx的docker镜像 nginx:1.14.0,容器的端口设置 containerPort: 80, volumeMounts表示绑定的文件和目录

    spec.template.spec.volumes 表示选择的容器挂载的宿主机的文件和目录 conf, log和html

    2. 创建deployment的nginx

    kubectl create -f nginx-deployment.yaml

    3. 查询nginx命名空间下的pods

    # ➜  kube kubectl get pods -n nginx
    NAME                                 READY   STATUS    RESTARTS   AGE
    nginx-deployment1-6cb86fb6b7-kkpbw   1/1     Running   5          7d20h

    可以看到有一个nginx-deployment的pods, 启动了1个pods运行Running状态

    可以通过修改如上yaml文件的spec.replicas启动多个pods,

    增加pods节点从1个到3个如下

    spec.replicas: 3

    # ➜  kube kubectl get pods -n nginx
    NAME                                 READY   STATUS              RESTARTS   AGE
    nginx-deployment1-6cb86fb6b7-kkpbw   1/1     Running             5          7d20h
    nginx-deployment1-6cb86fb6b7-txkkj   0/1     ContainerCreating   0          1s
    nginx-deployment1-6cb86fb6b7-ztt2t   0/1     ContainerCreating   0          1s

    如上可以看到有两个新的pod处于容器创建中状态,容器创建成功后,状态会转移到Running,READY也会变成1/1

    减少pods节点从3个到1个如下

    # ➜  kube kubectl apply -f nginx-deployment.yaml
    deployment.apps/nginx-deployment1 configured
    # ➜  kube kubectl get pods -n nginx
    NAME                                 READY   STATUS        RESTARTS   AGE
    nginx-deployment1-6cb86fb6b7-d6z6l   1/1     Terminating   0          98s
    nginx-deployment1-6cb86fb6b7-kkpbw   1/1     Running       5          7d20h
    nginx-deployment1-6cb86fb6b7-qtx2v   1/1     Terminating   0          98s

    如上所示,有两个pod状态是终止中,只剩余一个处于Running状态

    4. 查询命名空间nginx下的发布deployment

    # ➜  kube kubectl describe deployment nginx -n nginx
    Name:                   nginx-deployment1
    Namespace:              nginx
    CreationTimestamp:      Thu, 30 Sep 2021 11:46:53 +0800
    Labels:                 app=nginx
    Annotations:            deployment.kubernetes.io/revision: 1
    Selector:               app=nginx
    Replicas:               1 desired | 1 updated | 1 total | 1 available | 0 unavailable
    # ...

    可以看到pods节点是1个。

    5. 查询命名空间nginx下的发布pod详情

    # ➜  kube kubectl describe pod nginx-deployment1-6cb86fb6b7-kkpbw -n nginx
    Name:         nginx-deployment1-6cb86fb6b7-kkpbw
    Namespace:    nginx
    Priority:     0
    Node:         docker-desktop/192.168.65.4
    Start Time:   Thu, 30 Sep 2021 15:12:48 +0800
    Labels:       app=nginx
                  pod-template-hash=6cb86fb6b7
    Annotations:  <none>
    Status:       Running
    IP:           10.1.0.170
    # ...

     6. 删除一个deployment的pod节点

    # ➜  kube kubectl delete pod  nginx-deployment1-6cb86fb6b7-txkkj -n nginx
    pod "nginx-deployment1-6cb86fb6b7-txkkj" deleted

    三、创建nginx的服务Service

    1. 创建service的yaml文件 nginx-service.yaml

    # ➜  kube cat nginx-service.yaml
    apiVersion: v1
    kind: Service
    metadata:
      labels:
       app: nginx
      name: nginx-deployment1
      namespace: nginx
    spec:
      ports:
      - port: 9000
        name: nginx-service80
        protocol: TCP
        targetPort: 80
        nodePort: 31090
      selector:
        app: nginx
      type: NodePort

    配置说明:

    kind: Service表示yaml文件创建的是一个Service

    metadata表示这个Service的元信息

    metadata.name 是Service的名称 nginx-deployment1

    metadata.labels 是Service的标签 即:app=nginx

    metadata.namespace  是Service的命名空间,此处选择的是第一步创建的命名空间nginx

    sepc是Service的详细配置说明

    sepc.type 取值NodePort 表示这个Service的类型是一个节点端口转发类型

    sepc.selector 表示这个Service是将带标签的哪些pods做为一个集合对外通过服务

    sepc.ports.port 是Service绑定的端口

    sepc.ports.name: nginx-service80 表示Service服务的名称
    sepc.ports.protocol: TCP 表示Service转发请求到容器的协议是TCP,我们部署的http的nginx服务,因此选择协议为TCP
    sepc.ports.targetPort: 80 表示Service转发外部请求到容器的目标端口80,即deployment的pod容器对外开放的容器端口80
    sepc.ports.nodePort: 31090 表示Service对外开放的节点端口

    2. 创建一个服务

    # ➜  kube kubectl create -f nginx-service.yaml
    service/nginx-deployment1 created

    即可以使用浏览器打开这个端口的页面,如下

    4. 查询服务列表

    # ➜  kube kubectl get services -n nginx
    NAME                TYPE       CLUSTER-IP   EXTERNAL-IP   PORT(S)          AGE
    nginx-deployment1   NodePort   10.96.92.3   <none>        9000:31090/TCP   34s

    5. 查询服务详情

    # ➜  kube kubectl describe service nginx-deployment1 -n nginx
    Name:                     nginx-deployment1
    Namespace:                nginx
    Labels:                   app=nginx
    Annotations:              <none>
    Selector:                 app=nginx
    Type:                     NodePort
    IP:                       10.96.92.3
    LoadBalancer Ingress:     localhost
    Port:                     nginx-service80  9000/TCP
    TargetPort:               80/TCP
    NodePort:                 nginx-service80  31090/TCP
    Endpoints:                10.1.0.170:80,10.1.0.176:80,10.1.0.178:80
    Session Affinity:         None
    External Traffic Policy:  Cluster
    Events:                   <none>

    6. 删除一个service服务

    # ➜  kube kubectl delete services nginx-deployment1 -n nginx
    service "nginx-deployment1" deleted

    如上就是通过k8s简单部署一个nginx服务的步骤

    其中包括如下步骤

    • 命名空间的创建
    • 标签的增加
    • deployment的pods发布,增加和减少pods的方法
    • 节点端口转发的Service创建
    • 删除一个服务
    • 删除一个pod

    done.

    祝玩的开心~

  • 相关阅读:
    @codeforces
    @atcoder
    @loj
    @atcoder
    @atcoder
    @loj
    @atcoder
    @atcoder
    @atcoder
    @uoj
  • 原文地址:https://www.cnblogs.com/voipman/p/15378589.html
Copyright © 2020-2023  润新知