极客时间运维进阶训练营第十三周作业
1、在集群上使用资源配置文件编排运行 demoapp,并使用 Service 完成 Pod 发现和服务发布。
root@k8s-master01:/tmp/k8s# cat v1-demo.yaml apiVersion: apps/v1 kind: Deployment metadata: labels: app: demoapp-v1 name: demoapp-v1 spec: replicas: 3 selector: matchLabels: app: demoapp-v1 template: metadata: labels: app: demoapp-v1 spec: containers: - image: ikubernetes/demoapp:v1.0 name: demoapp --- apiVersion: v1 kind: Service metadata: name: demoapp-v1 spec: ports: - name: 80-80 port: 80 protocol: TCP targetPort: 80 selector: app: demoapp-v1 type: ClusterIP --- apiVersion: v1 kind: Service metadata: name: demoapp-v1-nodeport spec: ports: - name: 80-80 port: 80 protocol: TCP targetPort: 80 selector: app: demoapp-v1 type: NodePort #externalTrafficPolicy: Local root@k8s-master01:/tmp/k8s# kubectl apply -f v1-demo.yaml deployment.apps/demoapp-v1 created service/demoapp-v1 created service/demoapp-v1-nodeport created root@k8s-master01:/tmp/k8s# kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE demoapp-v1 3/3 3 3 66s nfs-server 1/1 1 1 21h root@k8s-master01:/tmp/k8s# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES configmaps-volume-demo 1/1 Running 1 (15h ago) 18h 10.244.3.21 k8s-node03.magedu.com <none> <none> demoapp-v1-6dfd48f884-4bhjz 1/1 Running 0 78s 10.244.2.34 k8s-node02.magedu.com <none> <none> demoapp-v1-6dfd48f884-6kldt 1/1 Running 0 78s 10.244.3.28 k8s-node03.magedu.com <none> <none> demoapp-v1-6dfd48f884-mw7bq 1/1 Running 0 78s 10.244.1.25 k8s-node01.magedu.com <none> <none> init-container-demo 1/1 Running 3 (15h ago) 7d18h 10.244.1.17 k8s-node01.magedu.com <none> <none> liveness-httpget-demo 1/1 Running 62 (15h ago) 7d21h 10.244.3.22 k8s-node03.magedu.com <none> <none> nfs-server-857f859f57-4ttvl 1/1 Running 1 (15h ago) 21h 10.244.3.20 k8s-node03.magedu.com <none> <none> redis-pvc-pod 1/1 Running 2 (15h ago) 6d8h 10.244.3.24 k8s-node03.magedu.com <none> <none> secrets-env-demo 1/1 Running 0 14h 10.244.2.27 k8s-node02.magedu.com <none> <none> secrets-volume-demo 1/1 Running 0 14h 10.244.2.28 k8s-node02.magedu.com <none> <none> securitycontext-capabilities-demo 1/1 Running 3 (15h ago) 7d21h 10.244.1.18 k8s-node01.magedu.com <none> <none> root@k8s-master01:/tmp/k8s# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE demoapp-v1 ClusterIP 10.103.1.134 <none> 80/TCP 86s demoapp-v1-nodeport NodePort 10.109.229.40 <none> 80:30212/TCP 86s kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 24d nfs-server ClusterIP 10.110.209.63 <none> 2049/TCP,111/UDP 21h root@k8s-master01:/tmp/k8s# curl 10.103.1.134 iKubernetes demoapp v1.0 !! ClientIP: 192.168.56.161, ServerName: demoapp-v1-6dfd48f884-6kldt, ServerIP: 10.244.3.28! root@k8s-master01:/tmp/k8s# curl 10.103.1.134 iKubernetes demoapp v1.0 !! ClientIP: 192.168.56.161, ServerName: demoapp-v1-6dfd48f884-mw7bq, ServerIP: 10.244.1.25! root@k8s-master01:/tmp/k8s# curl 10.103.1.134 iKubernetes demoapp v1.0 !! ClientIP: 192.168.56.161, ServerName: demoapp-v1-6dfd48f884-mw7bq, ServerIP: 10.244.1.25! root@template-ubuntun2004:~# hostname -i 192.168.56.169 root@template-ubuntun2004:~# curl 192.168.56.166:30212 iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.0, ServerName: demoapp-v1-6dfd48f884-6kldt, ServerIP: 10.244.3.28! root@template-ubuntun2004:~# curl 192.168.56.166:30212 iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.0, ServerName: demoapp-v1-6dfd48f884-6kldt, ServerIP: 10.244.3.28! root@template-ubuntun2004:~# curl 192.168.56.166:30212 iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.0, ServerName: demoapp-v1-6dfd48f884-4bhjz, ServerIP: 10.244.2.34! root@template-ubuntun2004:~# curl 192.168.56.166:30212 iKubernetes demoapp v1.0 !! ClientIP: 10.244.1.1, ServerName: demoapp-v1-6dfd48f884-mw7bq, ServerIP: 10.244.1.25!
2、要求以配置文件的方式,在集群上编排运行 nginx、wordpress 和 mysql,并使用 Service 完成 Pod 发现和服务发布。
提示:使用 Secret 的方式的为 wordpress 指定要使用 mysql 服务器地址、数据库名称、用户名称和用户密码;
nginx Service:定义为 NodePort 类型;
nginx 的配置文件:要通过 ConfigMap 提供;
wordpress 和 mysql 的数据要保存于 PVC 上。
# 创建namespace root@k8s-master01:~/learning-k8s-master/wordpress# kubectl create namespace blog namespace/blog created # 部署mysql root@k8s-master01:~/learning-k8s-master/wordpress/mysql# cat 01-secret-mysql.yaml apiVersion: v1 kind: Secret metadata: creationTimestamp: null name: mysql-user-pass data: database.name: d3BkYg== root.password: TUBnZUVkdQ== user.name: d3B1c2Vy user.password: bWFnZURVLmMwbQ== root@k8s-master01:~/learning-k8s-master/wordpress/mysql# cat 02-pvc-mysql-data.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-data spec: volumeMode: Filesystem accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: nfs-csi root@k8s-master01:~/learning-k8s-master/wordpress/mysql# cat 03-service-mysql.yaml apiVersion: v1 kind: Service metadata: labels: app: mysql name: mysql spec: ports: - name: mysql port: 3306 protocol: TCP targetPort: 3306 selector: app: mysql type: ClusterIP root@k8s-master01:~/learning-k8s-master/wordpress/mysql# cat 04-deploy-mysql.yaml apiVersion: apps/v1 kind: Deployment metadata: labels: app: mysql name: mysql spec: replicas: 1 selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - image: mysql:8.0 name: mysql env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-user-pass key: root.password - name: MYSQL_USER valueFrom: secretKeyRef: name: mysql-user-pass key: user.name - name: MYSQL_PASSWORD valueFrom: secretKeyRef: name: mysql-user-pass key: user.password - name: MYSQL_DATABASE valueFrom: secretKeyRef: name: mysql-user-pass key: database.name volumeMounts: - name: mysql-data mountPath: /var/lib/mysql/ volumes: - name: mysql-data persistentVolumeClaim: claimName: mysql-data root@k8s-master01:~/learning-k8s-master/wordpress# kubectl apply -f mysql/ -n blog secret/mysql-user-pass created persistentvolumeclaim/mysql-data created service/mysql created deployment.apps/mysql created root@k8s-master01:~/learning-k8s-master/wordpress# kubectl get secret -n blog NAME TYPE DATA AGE mysql-user-pass Opaque 4 42s root@k8s-master01:~/learning-k8s-master/wordpress# kubectl get pvc -n blog NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE mysql-data Bound pvc-8850eab3-0965-4ae5-8a62-ef30b29ce135 10Gi RWO nfs-csi 57s root@k8s-master01:~/learning-k8s-master/wordpress# kubectl get pod -n blog NAME READY STATUS RESTARTS AGE mysql-97b69dcc8-8ksj9 1/1 Running 0 70s root@k8s-master01:~/learning-k8s-master/wordpress# kubectl get svc -n blog NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE mysql ClusterIP 10.106.255.108 <none> 3306/TCP 85s # 部署wordpress root@k8s-master01:~/learning-k8s-master/wordpress/wordpress# cat 01-service-wordpress.yaml apiVersion: v1 kind: Service metadata: labels: app: wordpress name: wordpress spec: ports: - name: fpm port: 9000 protocol: TCP targetPort: 9000 selector: app: wordpress root@k8s-master01:~/learning-k8s-master/wordpress/wordpress# cat 02-pvc-wordpress-app-data.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: wordpress-app-data spec: volumeMode: Filesystem accessModes: - ReadWriteMany resources: requests: storage: 10Gi storageClassName: nfs-csi root@k8s-master01:~/learning-k8s-master/wordpress/wordpress# cat 03-deployment-wordpress.yaml apiVersion: apps/v1 kind: Deployment metadata: labels: app: wordpress name: wordpress spec: replicas: 1 selector: matchLabels: app: wordpress template: metadata: labels: app: wordpress spec: containers: - image: wordpress:5.8-fpm name: wordpress env: - name: WORDPRESS_DB_HOST value: mysql - name: WORDPRESS_DB_USER valueFrom: secretKeyRef: name: mysql-user-pass key: user.name - name: WORDPRESS_DB_PASSWORD valueFrom: secretKeyRef: name: mysql-user-pass key: user.password - name: WORDPRESS_DB_NAME valueFrom: secretKeyRef: name: mysql-user-pass key: database.name volumeMounts: - name: wordpress-app-data mountPath: /var/www/html/ volumes: - name: wordpress-app-data persistentVolumeClaim: claimName: wordpress-app-data root@k8s-master01:~/learning-k8s-master/wordpress/wordpress# cd .. root@k8s-master01:~/learning-k8s-master/wordpress# kubectl apply -f wordpress/ -n blog service/wordpress created persistentvolumeclaim/wordpress-app-data created deployment.apps/wordpress created root@k8s-master01:~/learning-k8s-master/wordpress# kubectl get pvc -n blog NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE mysql-data Bound pvc-8850eab3-0965-4ae5-8a62-ef30b29ce135 10Gi RWO nfs-csi 7m41s wordpress-app-data Bound pvc-a1edb97f-fce5-4358-9258-6f3ff50ef00b 10Gi RWX nfs-csi 50s root@k8s-master01:~/learning-k8s-master/wordpress# kubectl get pods -n blog NAME READY STATUS RESTARTS AGE mysql-97b69dcc8-8ksj9 1/1 Running 0 8m28s wordpress-664cfb496b-pchj2 0/1 ContainerCreating 0 97s root@k8s-master01:~/learning-k8s-master/wordpress# kubectl get pods -n blog NAME READY STATUS RESTARTS AGE mysql-97b69dcc8-8ksj9 1/1 Running 0 10m wordpress-664cfb496b-pchj2 1/1 Running 0 3m35s # 部署nginx root@k8s-master01:~/learning-k8s-master/wordpress/nginx# cat 01-configmap-nginx-conf.yaml apiVersion: v1 data: nginx.conf: | server { listen 80; listen [::]:80; server_name magedu.com www.magedu.com; index index.php index.html index.htm; root /var/www/html; location ~ /.well-known/acme-challenge { allow all; root /var/www/html; } location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass wordpress:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } location ~ /\.ht { deny all; } location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { log_not_found off; access_log off; allow all; } location ~* \.(css|gif|ico|jpeg|jpg|js|png)$ { expires max; log_not_found off; } } kind: ConfigMap metadata: creationTimestamp: null name: nginx-conf root@k8s-master01:~/learning-k8s-master/wordpress/nginx# cat 02-service-nginx.yaml apiVersion: v1 kind: Service metadata: labels: app: nginx name: nginx spec: ports: - name: http-80 port: 80 protocol: TCP targetPort: 80 selector: app: nginx type: NodePort externalIPs: - 192.168.56.100 root@k8s-master01:~/learning-k8s-master/wordpress/nginx# cat 03-deployment-nginx.yaml apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx name: nginx spec: replicas: 1 selector: matchLabels: app: nginx strategy: rollingUpdate: maxSurge: 1 maxUnavailable: 0 template: metadata: labels: app: nginx spec: volumes: - name: ngxconf configMap: name: nginx-conf - name: wordpress-app-data persistentVolumeClaim: claimName: wordpress-app-data containers: - image: nginx:1.20-alpine name: nginx volumeMounts: - name: ngxconf mountPath: /etc/nginx/conf.d/ - name: wordpress-app-data mountPath: /var/www/html/ root@k8s-master01:~/learning-k8s-master/wordpress/nginx# cd .. root@k8s-master01:~/learning-k8s-master/wordpress# kubectl apply -f nginx/ -n blog configmap/nginx-conf created service/nginx created deployment.apps/nginx created # cd .. root@k8s-master01:~/learning-k8s-master/wordpress# kubectl apply -f nginx/ -n bl configmap/nginx-conf created service/nginx created deployment.apps/nginx created root@k8s-master01:~/learning-k8s-master/wordpress# kubectl get pods -n blog NAME READY STATUS RESTARTS AGE mysql-97b69dcc8-8ksj9 1/1 Running 0 22m nginx-5b9c7b4c8f-xmpmx 1/1 Running 0 36s wordpress-664cfb496b-pchj2 1/1 Running 0 15m root@k8s-master01:~/learning-k8s-master/wordpress# kubectl get configmap -n blog NAME DATA AGE kube-root-ca.crt 1 23m nginx-conf 1 52s root@k8s-master01:~/learning-k8s-master/wordpress/nginx# kubectl get svc -n blog NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE mysql ClusterIP 10.106.255.108 <none> 3306/TCP 26m nginx NodePort 10.109.140.16 192.168.56.100 80:31112/TCP 4m44s wordpress ClusterIP 10.109.192.8 <none> 9000/TCP 19m # 验证地址 http://192.168.56.166:31112/wp-admin/install.php http://192.168.56.100/wp-admin/install.php