为了更深入的理解Operator 的工作方式,我们先看一下,如果没有Operator,我们来部署一个应用需要多少步骤,每一步骤都需要做什么:
首先,这个例子叫做Visitors Site
他会将每个访问的ip记录到数据库,并展示到首页,架构非常简单
前台页面用的React ,后台处理业务逻辑使用的是Django ,然后数据存储是Mysql(注意,本例子中mysql 没有做持久化存储,重启会丢失数据)
对于mysql来说:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
$cat database.yaml --- apiVersion: v1 kind: Secret metadata: name: mysql-auth type: Opaque stringData: username: visitors-user password: visitors-pass --- apiVersion: apps/v1 kind: Deployment metadata: name: mysql spec: replicas: 1 selector: matchLabels: app: visitors tier: mysql template: metadata: labels: app: visitors tier: mysql spec: containers: - name: visitors-mysql image: "mysql:5.7" imagePullPolicy: Always ports: - name: mysql containerPort: 3306 protocol: TCP env: - name: MYSQL_ROOT_PASSWORD value: password - name: MYSQL_DATABASE value: visitors_db - name: MYSQL_USER valueFrom: secretKeyRef: name: mysql-auth key: username - name: MYSQL_PASSWORD valueFrom: secretKeyRef: name: mysql-auth key: password --- apiVersion: v1 kind: Service metadata: name: mysql-service labels: app: visitors tier: mysql spec: clusterIP: None ports: - port: 3306 selector: app: visitors tier: mysql% |
三个资源被创建,secret ,deployment, 和service
同样的后端:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
$cat backend.yaml --- apiVersion: apps/v1 kind: Deployment metadata: name: visitors-backend spec: replicas: 1 selector: matchLabels: app: visitors tier: backend template: metadata: labels: app: visitors tier: backend spec: containers: - name: visitors-backend image: "jdob/visitors-service:1.0.0" imagePullPolicy: Always ports: - name: visitors containerPort: 8000 env: - name: MYSQL_DATABASE value: visitors_db - name: MYSQL_SERVICE_HOST value: mysql-service - name: MYSQL_USERNAME valueFrom: secretKeyRef: name: mysql-auth key: username - name: MYSQL_PASSWORD valueFrom: secretKeyRef: name: mysql-auth key: password --- apiVersion: v1 kind: Service metadata: name: visitors-backend-service labels: app: visitors tier: backend spec: type: NodePort ports: - port: 8000 targetPort: 8000 nodePort: 30685 protocol: TCP selector: app: visitors tier: backend |
后端只用了两个资源,但是后端要注意一个地方,他需要从环境变量里读取mysql的service的名字,要不然它找不到数据库
最后是前端:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
$cat frontend.yaml --- apiVersion: apps/v1 kind: Deployment metadata: name: visitors-frontend spec: replicas: 1 selector: matchLabels: app: visitors tier: frontend template: metadata: labels: app: visitors tier: frontend spec: containers: - name: visitors-frontend image: "jdob/visitors-webui:1.0.0" imagePullPolicy: Always ports: - name: visitors containerPort: 3000 env: - name: REACT_APP_TITLE value: "Visitors Dashboard" --- apiVersion: v1 kind: Service metadata: name: visitors-frontend-service labels: app: visitors tier: frontend spec: type: NodePort ports: - port: 3000 targetPort: 3000 nodePort: 30686 protocol: TCP selector: app: visitors tier: frontend |
1 2 3 4 5 6 |
$ kubectl apply -f ch05/database.yaml secret/mysql-auth created deployment.apps/mysql created service/mysql-service created $ kubectl apply -f ch05/backend.yaml deployment.apps/visitors-backend created service/visitors-backend-service created $ kubectl apply -f ch05/frontend.yaml deployment.apps/visitors-frontend created service/visitors-frontend-service created |
Latest posts by Zhiming Zhang (see all)
- aws eks node 自动化扩展工具 Karpenter - 8月 10, 2022
- ReplicationController and ReplicaSet in Kubernetes - 12月 20, 2021
- public key fingerprint - 5月 27, 2021