Fork me on GitHub

【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

 

四、 其他命令

4.1 发布镜像

kubectl set image pod deployment/nginx-deployment nginx-deployment =xxx.domain.com/image-test-env/nginx-deployment -n nginx

4.2 重启 pod

kubectl rollout restart deployment nginx-deployment -n nginx

  

done.

祝玩的开心~

posted @ 2021-10-08 12:32  Mr.YF  阅读(19740)  评论(1编辑  收藏  举报