K8s部署Nginx服务并挂载发布目录到宿主机

创建deployment

创建deployment 用来部署应用。利用k8s部署的nginx如果需要进行版本发布修改inde.htm比较麻烦,需要进入pod中修改。然而使用volumeMounts挂载发布目录的方式可以解决一部分的问题。
由于我采用的镜像是自己构建的编译安装的nginx,所以挂载目录不是默认的位置,安装目录不在这里的注意修改。(- mountPath: “/usr/local/nginx/html/”

完整的nginx-dep.yml如下

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:v1.0
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: "/usr/local/nginx/html/"
          name: nginx-vol
      volumes:
      - name: nginx-vol
        hostPath:
          path: /html/

创建nginx-dep 执行命令:

kubectl apply -f nginx-dep.yml

查看 deployment 状态:

kubectl get deploy -o wide

可以看到,刚创建的 nginx-deployment 的 3 个副本均处于 READY 状态:

NAME               READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES         SELECTOR
nginx-deployment   3/3     3            3           48s   nginx        nginx:alpine   app=nginx

创建 service

k8s 使用 service 来实现服务发现,常见配置包括:

spec.selector:用于定义如何选择 pod
spec.ports:用于定义如何暴露端口,其中,nodePort 指定可以在外部访问的端口

完整的 nginx-svc.yml 文件如下:

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30080
  type: NodePort

为创建 servcie,执行命令:

kubectl apply -f nginx-svc.yml

查看 service 的状态:

kubectl get svc nginx-service -o wide

输出:


NAME            TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE   SELECTOR
nginx-service   NodePort   10.106.209.76   <none>        80:30080/TCP   26s   app=nginx

为了验证在外部正常访问 nginx,打开浏览器,输入地址 http://localhost:30080/,可以看到 nginx 的欢迎页面,说明 nginx-service 创建成功

写了一个小脚本实现nginx服务的发布更新以及pod的启停

#!/usr/bin/env bash
dir=/html/index.html
tdir=/html/
nginx=/root/k8s/deployment/nginx-dep.yml
svc=/root/k8s/deployment/nginx-svc.yml
case $1 in
    scp)

        scp $dir  node1:$tdir
        scp $dir  node2:$tdir
        ;;
    delete)

        kubectl delete -f $nginx 2>/dev/null
        kubectl delete -f $svc   2>/dev/null
        ;;

    reload)

        scp $dir  node1:$tdir
        scp $dir  node2:$tdir
        sleep 3
        kubectl delete -f $nginx 2>/dev/null
        kubectl delete -f $svc   2>/dev/null
        sleep 3
        kubectl apply -f $nginx
        kubectl apply -f $svc
        ;;
    *)

        echo "Uasge:please choose {scp | delete | reload }"
esac
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐