Shawn's Blog

蒸汽兔

初探k8s-通过资源文件部署应用(三)

字数:452 字 阅读时长:约 2 分钟 阅读

概述

我们知道通过 run 命令启动容器非常麻烦,Docker 提供了 Compose 为我们解决了这个问题。那 Kubernetes 是如何解决这个问题的呢?其实很简单,使用 kubectl apply 命令就可以做到和 Compose 一样的效果了,该命令可以通过配置文件快速创建一个集群资源对象

部署 Deployment

创建一个名为 nginx.yaml 的配置文件

# API 版本号
apiVersion: apps/v1
# 类型,如:Pod/ReplicationController/Deployment/Service/Ingress
kind: Deployment
metadata:
  # Kind 的名称
  name: nginx-app
spec:
  selector:
    matchLabels:
      # 容器标签的名字,发布 Service 时,selector 需要和这里对应
      app: nginx
  # 部署的实例数量
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      # 配置容器,数组类型,说明可以配置多个容器
      containers:
      # 容器名称
      - name: nginx
        # 容器镜像
        image: nginx:1.17
        # 只有镜像不存在时,才会进行镜像拉取
        imagePullPolicy: IfNotPresent
        ports:
        # Pod 端口
        - containerPort: 80

发布 Service

nginx.yaml 配置文件中追加如下配置

# 不要忘记这里的三条横线
---
# API 版本号
apiVersion: v1
# 类型,如:Pod/ReplicationController/Deployment/Service/Ingress
kind: Service
# 元数据
metadata:
  # Kind 的名称
  name: nginx-http
spec:
  # 暴露端口
  ports:
    # Service 暴露的端口
    - port: 80
      # Pod 上的端口,这里是将 Service 暴露的端口转发到 Pod 端口上
      targetPort: 80
  # 类型
  type: LoadBalancer
  # 标签选择器
  selector:
    # 需要和上面部署的 Deployment 标签名对应
    app: nginx
# 部署
kubectl apply -f nginx.yaml

# 删除
kubectl delete -f nginx.yaml

镜像拉取策略说明

支持三种 ImagePullPolicy

  • Always: 不管镜像是否存在都会进行一次拉取
  • Never: 不管镜像是否存在都不会进行拉取
  • IfNotPresent: 只有镜像不存在时,才会进行镜像拉取

注意

  • 默认为 IfNotPresent,但 :latest 标签的镜像默认为 Always
  • 拉取镜像时 Docker 会进行校验,如果镜像中的 MD5 码没有变,则不会拉取镜像数据
  • 生产环境中应该尽量避免使用 :latest 标签,而开发环境中可以借助 :latest 标签自动拉取最新的镜像

验证是否生效

查看 Pod 列表

kubectl get pods

# 输出如下
NAME                         READY   STATUS    RESTARTS   AGE
nginx-app-798dcc9989-xh6t5   1/1     Running   0          111s
nginx-app-798dcc9989-xvqpd   1/1     Running   0          111s

查看 Deployment 列表

kubectl get deployment

# 输出如下
NAME        READY   UP-TO-DATE   AVAILABLE   AGE
nginx-app   2/2     2            2           2m11s

查看 Service 列表

kubectl get service

# 输出如下
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP      10.96.0.1       <none>        443/TCP        86m
nginx-http   LoadBalancer   10.103.131.19   <pending>     80:30355/TCP   2m23s

查看 Service 详情

kubectl describe service nginx-http

# 输出如下
Name:                     nginx-http
Namespace:                default
Labels:                   <none>
Annotations:              kubectl.kubernetes.io/last-applied-configuration:
                            {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"nginx-http","namespace":"default"},"spec":{"ports":[{"port":80,"t...
Selector:                 app=nginx
Type:                     LoadBalancer
IP:                       10.103.131.19
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  30355/TCP
Endpoints:                10.244.129.69:80,10.244.81.4:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

通过浏览器访问

通过浏览器访问 http://192.168.81.120:30355/ ,出现 Nginx 欢迎页即表示成功


© Shawn Jim. All rights reserved. 本站总访问量 次, 访客数 人次.