「Kubernetes」- 部署 Web 应用(快速开始)

  CREATED BY JENKINSBOT

问题描述

该笔记将记录:在 Kubernetes Cluster 中,部署演示使用的 Web 应用,以快速入门。

解决方案

MySQL

cat > mysql.yaml <<EOF
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:5.7
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "123456"
---
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
  - port: 3306
  selector:
    app: mysql
EOF

kubectl apply -f mysql.yaml

Tomcat

cat > myweb.yaml <<EOF
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myweb
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myweb
  template:
    metadata:
      labels:
        app: myweb
    spec:
      containers:
      - name: myweb
        image: kubeguide/tomcat-app:v1
        ports:
        - containerPort: 8080
        env:
        - name: MYSQL_SERVICE_HOST
          value: 'mysql'
        - name: MYSQL_SERVICE_PORT
          value: '3306'
---
apiVersion: v1
kind: Service
metadata:
  name: myweb
spec:
  ports:
  - port: 8080
  selector:
    app: myweb
EOF

kubectl apply -f myweb.yaml

Ingress

cat > myweb-ingress.yaml <<EOF
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: myweb-ingress
  annotations:
    # use the shared ingress-nginx
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: "k8s-ingress.example.xyz"
    http:
      paths:
      - path: /
        backend:
          serviceName: myweb
          servicePort: 8080
EOF

kubectl apply -f ./myweb-ingress.yaml

访问页面

返回如下页面表示成功:

常见 Port 位置及含义

每个节点上都运行 kube-proxy 容器,它的作用是操作 iptables 规则,kube-proxy 会在防火墙上配置 DNAT 规则,将指定端口的访问传递给对应的容器。

在 Kubernetes 1.9.1 中,开始 beta 版本 IPVS 特性,也是在操作 Netfilter 进行流量转发。

在 Service 中

targetPort
在「Pod」中的容器的端口。

port
由「Service」暴露的端口。在容器内部使用,供容器之间访问。

nodePort
外部机器可访问的端口。在「Node」上暴露的端口,可以通过「IPAddress:Port」的形式直接访问;

在 Ingress 中

ServicePort
在 Ingress 中,能够看到对应关系,ServicePort 对于 Serivce 的 Port 参数。

常用命令汇总

更新 Deployment 的某个镜像:

# kubectl set image deployment/my-deployment mycontainer=myimage:latest

参考文献

一个简单的Kubernetes应用部署示例
Kubernetes中的nodePort,targetPort,port的区别和意义(转)
Kubernetes how to make Deployment to update image
Basic usage – NGINX Ingress Controller