• kubernetes进阶 (三) 基础练习


    前两天朋友给了我几道题,看着挺简单的,但实际做的时候发现坑不少,这里做下笔记

    一、镜像构建部署lnmp

    1. 1、构建镜像 nginx、php、mysql 要求使用centos7作为基础镜像
    2. 2、使用deployment部署上面的容器,要求3个服务要放到一个pod中(虽然这样是不对的)
    3. 3、使用ingress 将上面部署的服务发布出去,通过访问nginx下的index.php访问链接到mysql数据库
    4. 4、nginx 和php 要求挂载宿主机的/apps/data/的目录做存储

    0、docker镜像加速配置留存

    我自己常用的一些加速源,如果你没有配置过就把下面的加上重启docker服务

    vi /etc/docker/daemon.json

    1. {
    2. "exec-opts": ["native.cgroupdriver=systemd"],
    3. "registry-mirrors": [
    4. "http://hub-mirror.c.163.com",
    5. "https://cn-north-4.mirror.huaweicloud.com",
    6. "https://registry.docker-cn.com",
    7. "https://mirror.ccs.tencentyun.com",
    8. "https://b9pmyelo.mirror.aliyuncs.com"
    9. ],
    10. "insecure-registries": ["10.0.16.15:30007"]
    11. }
    systemctl restart docker

    1、构建php镜像

    1. #创建构建目录
    2. mkdir /apps/build/{nginx,php,mysql} -p
    3. cd /apps/build/php/
    4. #拉取php包
    5. wget https://www.php.net/distributions/php-7.1.10.tar.gz --no-check-certificate

    vi Dockerfile

    1. FROM centos:7.4.1708
    2. ADD php-7.1.10.tar.gz /opt
    3. RUN yum -y install gcc gcc-c++ make gd-devel libxml2-devel libcurl-devel libjpeg-devel libpng-devel openssl-devel bison \
    4. && mkdir -p /usr/local/php/etc \
    5. && cd /opt/php-7.1.10/ \
    6. && ./configure --prefix=/usr/local/php \
    7. --with-config-file-path=/usr/local/php/etc \
    8. --with-gd --with-mysqli \
    9. --with-openssl --with-zlib --with-curl \
    10. --with-jpeg-dir --with-png-dir --with-iconv \
    11. --enable-fpm --enable-zip --enable-mbstring \
    12. && make -j 2 \
    13. && make install \
    14. && cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf \
    15. && cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf \
    16. && sed -i '/;daemonize/a\daemonize = no' /usr/local/php/etc/php-fpm.conf \
    17. && sed -i 's/127.0.0.1/0.0.0.0/g' /usr/local/php/etc/php-fpm.d/www.conf \
    18. && echo "${TIME_ZOME}" > /etc/timezone \
    19. && ln -sf /usr/share/zoneinfo/${TIME_ZOME} /etc/localtime \
    20. && rm -rf /opt/local/php* \
    21. && yum clean all \
    22. && yum -y remove gcc gcc-c++ make \
    23. && mkdir -p /usr/local/nginx/html \
    24. && echo -e "" > /usr/local/nginx/html/index.php
    25. WORKDIR /usr/local/php/
    26. EXPOSE 9000
    27. CMD ["sbin/php-fpm","-c","etc/php-fpm.conf"]

    构建

    1. #预计10分钟
    2. docker build . -f Dockerfile -t lnmp/php:v1

    2、构建mysql镜像

    1. cd /apps/build/mysql/
    2. wget https://dev.mysql.com/get/Downloads/mysql-5.6.26.tar.gz

     vi Dockerfile

    1. FROM centos:7.4.1708
    2. ADD mysql-5.6.26.tar.gz /opt
    3. RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo \
    4. && useradd -s /sbin/nologin mysql \
    5. && yum -y install gcc gcc-c++ make pcre-devel expat-devel perl ncurses-devel autoconf cmake \
    6. && cd /opt/mysql-5.6.26/ \
    7. && cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DEXTRA_CHARSETS=all -DSYSCONFIDIR=/etc -DMYSQL_DATADIR=/home/mysql/ -DMYSQL_UNIX_ADDR=/home/mysql/mysql.sock \
    8. && make -j2 \
    9. && make install \
    10. && cp -f support-files/my-default.cnf /etc/my.cnf \
    11. && cp support-files/mysql.server /etc/init.d/mysqld \
    12. && chown -R mysql:mysql /usr/local/mysql/ \
    13. && sed -i 's/^basedir/basedir=\/usr\/local\/mysql/g' /etc/init.d/mysqld \
    14. && sed -i 's/^datadir/datadir=\/home\/mysql/g' /etc/init.d/mysqld \
    15. && /usr/local/mysql/scripts/mysql_install_db --user=mysql --ldata=/var/lib/mysql --basedir=/usr/local/mysql --datadir=/home/mysql
    16. ENV PATH /usr/local/mysql/bin:$PATH
    17. EXPOSE 3306
    18. ENTRYPOINT ["/usr/local/mysql/bin/mysqld_safe"]

    构建

    1. #初次构建15分钟
    2. docker build . -f Dockerfile -t lnmp/mysql:v1

    3、构建nginx镜像

    1. cd /apps/build/nginx/
    2. wget http://nginx.org/download/nginx-1.12.0.tar.gz

    vi Dockerfile

    1. FROM centos:7.4.1708
    2. ADD nginx-1.12.0.tar.gz /opt
    3. RUN yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make \
    4. && useradd -M -s /sbin/nologin nginx \
    5. && cd /opt/nginx-1.12.0/ \
    6. && ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-file-aio --with-http_gzip_static_module --with-http_flv_module --with-http_ssl_module \
    7. && make \
    8. && make install \
    9. && ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx \
    10. && echo -e "events {\nuse epoll;\nworker_connections 1024;\n}\nhttp {\nserver_tokens on;\nserver {\nlisten 80;\nserver_name localhost;\nlocation / {\nroot html;\nindex index.html index.htmi index.php;\n}\nerror_page 500 502 503 504 /50x.html;\nlocation = /50x.html {\nroot html;\n}\nlocation ~ \.php$ {\nroot html;\nfastcgi_pass 172.168.184.30:9000;\nfastcgi_index index.php;\nfastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;\ninclude fastcgi_params;\n}\n}\n}" > /usr/local/nginx/conf/nginx.conf
    11. ENV PATH /usr/local/nginx/sbin:$PATH
    12. WORKDIR /usr/local/nginx/
    13. EXPOSE 80
    14. CMD ["nginx","-g","daemon off;"]

    构建

    docker build . -f Dockerfile -t lnmp/nginx:v1

     

    4、部署lnmp

    1. #主页文件挂在路径
    2. /usr/local/nginx/html
    3. #配置文件路径
    4. /usr/local/nginx/conf/nginx.conf

    创建密钥文件

    kubectl create secret generic mysql-pass --from-literal=password=Passwd123 --from-literal=database=tmp --from-literal=passwd=123

    vi /apps/build/lnmp.yaml

    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4. name: my-deployment
    5. spec:
    6. replicas: 1
    7. selector:
    8. matchLabels:
    9. app: my-app
    10. template:
    11. metadata:
    12. labels:
    13. app: my-app
    14. spec:
    15. containers:
    16. - name: nginx-container
    17. image: lnmp/nginx:v1
    18. volumeMounts:
    19. - name: data-volume
    20. mountPath: /usr/local/nginx/html
    21. - name: config-volume
    22. mountPath: /usr/local/nginx/conf/nginx.conf
    23. subPath: nginx.conf
    24. - name: php-container
    25. image: lnmp/php:v1
    26. volumeMounts:
    27. - name: data-volume
    28. mountPath: /usr/local/nginx/html
    29. - name: mysql-container
    30. image: lnmp/mysql:v1
    31. env:
    32. - name: MYSQL_ROOT_PASSWORD #mysqlroot密码
    33. valueFrom:
    34. secretKeyRef:
    35. name: mysql-pass
    36. key: password #Passwd123
    37. - name: MYSQL_DATABASE #默认的库
    38. valueFrom:
    39. secretKeyRef:
    40. name: mysql-pass
    41. key: database #tmp
    42. - name: MYSQL_USER
    43. value: sun #默认用户
    44. - name: MYSQL_PASSWORD
    45. valueFrom:
    46. secretKeyRef:
    47. name: mysql-pass
    48. key: passwd #默认密码 123
    49. volumes:
    50. - name: data-volume
    51. hostPath:
    52. path: /apps/data/
    53. - name: config-volume
    54. configMap:
    55. name: nginx-configmap
    56. items:
    57. - key: nginx.conf
    58. path: nginx.conf
    59. ---
    60. apiVersion: v1
    61. kind: Service
    62. metadata:
    63. name: nginx-php-mysql
    64. spec:
    65. type: NodePort
    66. ports:
    67. - name: nginx
    68. port: 80
    69. protocol: TCP
    70. targetPort: 80
    71. nodePort: 30010
    72. selector:
    73. app: my-app
    74. ---
    75. apiVersion: v1
    76. kind: ConfigMap
    77. metadata:
    78. name: nginx-configmap
    79. data:
    80. nginx.conf: |
    81. events {
    82. use epoll;
    83. worker_connections 1024;
    84. }
    85. http {
    86. server_tokens on;
    87. server {
    88. listen 80;
    89. server_name localhost;
    90. location / {
    91. root html;
    92. index index.html index.htmi index.php;
    93. }
    94. error_page 500 502 503 504 /50x.html;
    95. location = /50x.html {
    96. root html;
    97. }
    98. location ~ \.php$ {
    99. root html;
    100. fastcgi_pass localhost:9000;
    101. fastcgi_index index.php;
    102. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    103. include fastcgi_params;
    104. }
    105. }
    106. }

    部署

    kubectl apply -f lnmp.yaml

    5、配置php访问页面

    vi /apps/data/index.php

    1. phpinfo();
    2. ?>

    访问

    http://101.43.156.78:30010/index.php

    6、配置php链接mysql测试

    vi /apps/data/conn.php

    1. $link=mysqli_connect('localhost:3306','sun','123');
    2. if($link) echo "数据库链接成功";
    3. mysqli_close($link);
    4. ?>

    mysql授权

    1. #登录容器
    2. kubectl exec -it my-deployment-5bb547dc98-2qj77 -c mysql-container bash
    3. #授权
    4. mysql -e "GRANT ALL PRIVILEGES ON *.* TO 'sun'@'localhost' IDENTIFIED BY '123';"
    5. #上面没有要求做mysql的持久化,这里重新部署容器的时候这个权限要重新赋予

    访问

    http://101.43.156.78:30010/conn.php

    7、配置ingress控制器

    安装

    1. cd /apps/build
    2. wget https://ghproxy.com/https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.3.1/deploy/static/provider/cloud/deploy.yaml

    替换镜像

    1. sed -i s#registry.k8s.io/ingress-nginx/controller:v1.3.1@sha256:54f7fe2c6c5a9db9a0ebf1131797109bb7a4d91f56b9b362bde2abd237dd1974#registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.3.1#g deploy.yaml
    2. sed -i s#registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.3.0@sha256:549e71a6ca248c5abd51cdb73dbc3083df62cf92ed5e6147c780e30f7e007a47#registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.3.0#g deploy.yaml

    添加主机网络模式

    1. awk '/containers:/ {print " hostNetwork: true"} 1' deploy.yaml > ingress-controller.yaml
    2. rm -f deploy.yaml

     部署

    kubectl apply -f ingress-controller.yaml

     

     查看

    kubectl get pod,svc,ing,deploy -n ingress-nginx

     这里Completed是正常的

    8、部署http-backend

    vi http-backend.yaml

    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4. name: default-http-backend
    5. labels:
    6. k8s-app: default-http-backend
    7. namespace: kube-system
    8. spec:
    9. replicas: 1
    10. selector:
    11. matchLabels:
    12. k8s-app: default-http-backend
    13. template:
    14. metadata:
    15. labels:
    16. k8s-app: default-http-backend
    17. spec:
    18. terminationGracePeriodSeconds: 60
    19. containers:
    20. - name: default-http-backend
    21. # Any image is permissable as long as:
    22. # 1. It serves a 404 page at /
    23. # 2. It serves 200 on a /healthz endpoint
    24. image: registry.cn-hangzhou.aliyuncs.com/hachikou/defaultbackend:1.0
    25. livenessProbe:
    26. httpGet:
    27. path: /healthz #这个URI是 nginx-ingress-controller中nginx里配置好的localtion
    28. port: 8080
    29. scheme: HTTP
    30. initialDelaySeconds: 30 #30s检测一次/healthz
    31. timeoutSeconds: 5
    32. ports:
    33. - containerPort: 8080
    34. # resources:
    35. # limits:
    36. # cpu: 10m
    37. # memory: 20Mi
    38. # requests:
    39. # cpu: 10m
    40. # memory: 20Mi
    41. ---
    42. apiVersion: v1
    43. kind: Service #为default backend 创建一个service
    44. metadata:
    45. name: default-http-backend
    46. namespace: kube-system
    47. labels:
    48. k8s-app: default-http-backend
    49. spec:
    50. ports:
    51. - port: 80
    52. targetPort: 8080
    53. selector:
    54. k8s-app: default-http-backend

    部署

    kubectl apply -f http-backend.yaml

     9、添加ingress-nginx规则

    vi ingress-nginx.yaml

    1. apiVersion: networking.k8s.io/v1
    2. kind: Ingress
    3. metadata:
    4. name: nginx
    5. spec:
    6. ingressClassName: nginx
    7. rules:
    8. - host: www.han.com
    9. http:
    10. paths:
    11. - path: /
    12. pathType: Prefix
    13. backend:
    14. service:
    15. name: nginx-php-mysql
    16. port:
    17. number: 80

     部署

    kubectl apply -f ingress-nginx.yaml

    查看

     kubectl describe ingress nginx

    10、访问域名测试

    vi /etc/hosts 

    10.0.16.15 www.han.com

     访问

    curl www.han.com/conn.php

    二、部署mysql主从

    1. 1、使用statefulset 控制器部署mysql:8.0 要求副本数为2,且为主从关系
    2. 2、使用无头svc 发布,名称为mysql-headless
    3. 3、使用ingress发布mysql 端口为30012
    4. 4、使用动态存储卷(nfs),存储mysql数据

    0、准备nfs共享

    我集群就1台主机 随便放了

    1. yum install nfs-utils -y
    2. mkdir -p /apps/mysql_master_slave/data/{mysql-0,mysql-1}
    3. echo '/apps/mysql_master_slave/data/mysql-0 *(rw,no_root_squash)' >> /etc/exports
    4. echo '/apps/mysql_master_slave/data/mysql-1 *(rw,no_root_squash)' >> /etc/exports
    5. systemctl restart nfs-server

    1、创建持久卷

    cd /apps/mysql_master_slave

    vi mysql-pv.yaml

    1. apiVersion: v1
    2. kind: PersistentVolume
    3. metadata:
    4. name: pv-a # 为持久化卷A指定名称
    5. spec:
    6. capacity:
    7. storage: 1Gi
    8. accessModes:
    9. - ReadWriteOnce
    10. - ReadOnlyMany
    11. persistentVolumeReclaimPolicy: Recycle
    12. nfs:
    13. server: 10.0.16.15
    14. path: /apps/mysql_master_slave/data/mysql-0 # 指定NFS路径
    15. ---
    16. apiVersion: v1
    17. kind: PersistentVolume
    18. metadata:
    19. name: pv-b # 为持久化卷B指定名称
    20. spec:
    21. capacity:
    22. storage: 1Gi
    23. accessModes:
    24. - ReadWriteOnce
    25. - ReadOnlyMany
    26. persistentVolumeReclaimPolicy: Recycle
    27. nfs:
    28. server: 10.0.16.15
    29. path: /apps/mysql_master_slave/data/mysql-1 # 指定NFS路径

    部署

    1. kubectl apply -f mysql-pv.yaml
    2. #查看
    3. kubectl get pv

     2、编辑mysql主从配置

    vi mysql-configmap.yaml

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. name: mysql
    5. labels:
    6. app: mysql
    7. data:
    8. master.cnf: |
    9. # Apply this config only on the master.
    10. [mysqld]
    11. log-bin
    12. slave.cnf: |
    13. # Apply this config only on slaves.
    14. [mysqld]
    15. super-read-only

    部署

    kubectl apply -f mysql-configmap.yaml

    3、部署无头svc

    vi mysql-headless-svc.yaml

    1. apiVersion: v1
    2. kind: Service
    3. metadata:
    4. name: mysql-headless
    5. labels:
    6. app: mysql
    7. spec:
    8. ports:
    9. - name: mysql
    10. port: 3306
    11. clusterIP: None
    12. selector:
    13. app: mysql

    部署

    kubectl apply -f mysql-headless-svc.yaml

    4、部署mysql服务

    vi mysql-sts.yaml

    1. apiVersion: apps/v1
    2. kind: StatefulSet
    3. metadata:
    4. name: mysql-ss
    5. spec:
    6. selector:
    7. matchLabels:
    8. app: mysql
    9. serviceName: mysql-headless
    10. replicas: 2
    11. template:
    12. metadata:
    13. labels:
    14. app: mysql
    15. spec:
    16. initContainers:
    17. - name: init-mysql
    18. image: mysql:8.0.18
    19. command:
    20. - bash
    21. - "-c"
    22. - |
    23. set ex
    24. [[ `hostname` =~ -([0-9]+)$ ]] || exit 1
    25. ordinal=${BASH_REMATCH[1]}
    26. echo [mysqld] > /mnt/conf.d/server-id.cnf
    27. echo server-id=$((100 + $ordinal)) >> /mnt/conf.d/server-id.cnf
    28. if [[ $ordinal -eq 0 ]]; then
    29. cp /mnt/config-map/master.cnf /mnt/conf.d/
    30. else
    31. cp /mnt/config-map/slave.cnf /mnt/conf.d/
    32. fi
    33. volumeMounts:
    34. - name: conf
    35. mountPath: /mnt/conf.d
    36. - name: config-map
    37. mountPath: /mnt/config-map
    38. - name: clone-mysql
    39. image: jstang/xtrabackup:2.3
    40. command:
    41. - bash
    42. - "-c"
    43. - |
    44. set -ex
    45. [[ -d /var/lib/mysql/mysql ]] && exit 0
    46. [[ `hostname` =~ -([0-9]+)$ ]] || exit 1
    47. ordinal=${BASH_REMATCH[1]}
    48. [[ $ordinal -eq 0 ]] && exit 0
    49. ncat --recv-only mysql-ss-$(($ordinal-1)).mysql-headless 3307 | xbstream -x -C /var/lib/mysql
    50. xtrabackup --prepare --target-dir=/var/lib/mysql
    51. volumeMounts:
    52. - name: data
    53. mountPath: /var/lib/mysql
    54. subPath: mysql
    55. - name: conf
    56. mountPath: /etc/mysql/conf.d
    57. containers:
    58. - name: mysql
    59. image: mysql:8.0.18
    60. args: ["--default-authentication-plugin=mysql_native_password"]
    61. env:
    62. - name: MYSQL_ALLOW_EMPTY_PASSWORD
    63. value: "1"
    64. ports:
    65. - name: mysql
    66. containerPort: 3306
    67. volumeMounts:
    68. - name: data
    69. mountPath: /var/lib/mysql
    70. subPath: mysql
    71. - name: conf
    72. mountPath: /etc/mysql/conf.d
    73. resources:
    74. requests:
    75. cpu: 50m
    76. memory: 50Mi
    77. livenessProbe:
    78. exec:
    79. command: ["mysqladmin", "ping"]
    80. initialDelaySeconds: 30
    81. periodSeconds: 10
    82. timeoutSeconds: 5
    83. readinessProbe:
    84. exec:
    85. command: ["mysql", "-h", "127.0.0.1", "-e", "SELECT 1"]
    86. initialDelaySeconds: 5
    87. periodSeconds: 2
    88. timeoutSeconds: 1
    89. - name: xtrabackup
    90. image: jstang/xtrabackup:2.3
    91. ports:
    92. - name: xtrabackup
    93. containerPort: 3307
    94. command:
    95. - bash
    96. - "-c"
    97. - |
    98. set -ex
    99. cd /var/lib/mysql
    100. if [[ -s xtrabackup_slave_info ]]; then
    101. mv xtrabackup_slave_info change_master_to.sql.in
    102. rm -f xtrabackup_binlog_info
    103. elif [[ -f xtrabackup_binlog_info ]]; then
    104. [[ `cat xtrabackup_binlog_info` =~ ^(.*?)[[:space:]]+(.*?)$ ]] || exit 1
    105. rm xtrabackup_binlog_info
    106. echo "CHANGE MASTER TO MASTER_LOG_FILE='${BASH_REMATCH[1]}',\ MASTER_LOG_POS=${BASH_REMATCH[2]}" > change_master_to.sql.in
    107. fi
    108. sleep 10s
    109. if [[ -f change_master_to.sql.in ]]; then
    110. echo "Waiting for mysqld to be ready (accepting connections)"
    111. until mysql -h 127.0.0.1 -e "SELECT 1"; do sleep 1; done
    112. echo "Initializing replication from clone position"
    113. mv change_master_to.sql.in change_master_to.sql.orig
    114. sed 's/\\//' change_master_to.sql.orig
    115. mysql -h 127.0.0.1 -e "source change_master_to.sql.orig; CHANGE MASTER TO MASTER_HOST='mysql-ss-0.mysql-headless', MASTER_USER='root', MASTER_PASSWORD='', MASTER_CONNECT_RETRY=10; START SLAVE;"
    116. fi
    117. exec ncat --listen --keep-open --send-only --max-conns=1 3307 -c "xtrabackup --backup --slave-info --stream=xbstream --host=127.0.0.1 --user=root"
    118. volumeMounts:
    119. - name: data
    120. mountPath: /var/lib/mysql
    121. subPath: mysql
    122. - name: conf
    123. mountPath: /etc/mysql/conf.d
    124. resources:
    125. requests:
    126. cpu: 10m
    127. memory: 10Mi
    128. volumes:
    129. - name: conf
    130. emptyDir: {}
    131. - name: config-map
    132. configMap:
    133. name: mysql
    134. volumeClaimTemplates:
    135. - metadata:
    136. name: data
    137. spec:
    138. accessModes:
    139. - ReadWriteOnce
    140. resources:
    141. requests:
    142. storage: 0.1Gi

    部署

    1. kubectl apply -f mysql-sts.yaml
    2. #查看
    3. kubectl get pod

    5、验证mysql主从是否正常

    1. kubectl exec -it mysql-ss-1 -- bash
    2. mysql -e "SHOW SLAVE STATUS\G" | grep -E "Slave_IO_Running|Slave_SQL_Running"

     登录mysql-0 新增数据,去mysql-1 查看

    1. #数据库1
    2. create database ui;
    3. create table ui.user(name varchar(255));
    4. insert into ui.user(name) values("jstang");
    5. #数据库2
    6. select * from ui.user;

    6、ingres发布mysql (没整过,先略,下面是废话,跳过直接看三)

    对于使用 StatefulSet 部署的 MySQL,您可以通过 Ingress 来进行访问。然而需要注意的是,由于 MySQL 使用的是 TCP 协议而不是 HTTP/HTTPS,传统的 Ingress 无法直接代理 TCP 流量。不过,Kubernetes 社区提供了一种叫做 "TCP Ingress" 的解决方案,可以用来代理 TCP 流量,包括 MySQL。

    vi ingress-nginx.yaml

    1. spec:
    2. hostNetwork: true
    3. containers:
    4. - args:
    5. - /nginx-ingress-controller
    6. - --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller
    7. - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services #添加
    8. - --udp-services-configmap=$(POD_NAMESPACE)/udp-services #添加

    vi tcp-services.yaml

    1. apiVersion: v1
    2. kind: ConfigMap
    3. metadata:
    4. name: tcp-services
    5. namespace: default
    6. data:
    7. 3306: "default/mysql-headless:3306"

    kubectl apply -f tcp-services.yaml

    kubectl edit service ingress-nginx-controller -n ingress-nginx
    1. - name: tcp-service-3306
    2. port: 3306
    3. protocol: TCP
    4. targetPort: 3306
    5. #添加上述信息
    6. selector:
    7. app.kubernetes.io/component: controller
    8. app.kubernetes.io/instance: ingress-nginx
    9. app.kubernetes.io/name: ingress-nginx
    10. sessionAffinity: None
    11. type: LoadBalancer
    12. status:
    13. loadBalancer: {}

    三、 zabbix 监控

    1. 1、使用deployment部署zabbix,并使用daemonSet部署zabbix-agent
    2. 2、启动zabbix-UI页面后,选定指定的主机的物理ip才可访问(hostport + nodeSelector)
    3. 3、zabbix上可以监控上题的所有pod中的mysql(需要导入mysql监控模板)

     0、准备nfs目录

    1. mkdir -p /apps/zabbix/data
    2. echo "/apps/zabbix/data *(insecure,rw,sync,no_root_squash)" >> /etc/exports
    3. exportfs -r

     1、部署zabbix-mysql

    1. cd /apps/zabbix
    2. kubectl create namespace zabbix

    vi zabbix_mysql.yaml

    1. ---
    2. apiVersion: v1
    3. kind: PersistentVolume
    4. metadata:
    5. name: zabbixdb-pv
    6. spec:
    7. capacity: #创建存储的大小
    8. storage: 10Gi
    9. volumeMode: Filesystem #存储的类型
    10. accessModes:
    11. - ReadWriteOnce
    12. persistentVolumeReclaimPolicy: Recycle
    13. nfs:
    14. path: /apps/zabbix/data
    15. server: 10.0.16.15 #修改
    16. mountOptions:
    17. - hard
    18. - nfsvers=4.1
    19. ---
    20. apiVersion: v1
    21. kind: PersistentVolumeClaim
    22. metadata:
    23. name: zabbixdb-pvc
    24. namespace: zabbix
    25. spec:
    26. accessModes:
    27. - ReadWriteOnce
    28. volumeMode: Filesystem #存储类型 ,块存储Block
    29. resources:
    30. requests:
    31. storage: 8Gi
    32. ---
    33. apiVersion: apps/v1
    34. kind: Deployment
    35. metadata:
    36. labels:
    37. app: zabbixdb
    38. name: zabbixdb
    39. namespace: zabbix
    40. spec:
    41. replicas: 1
    42. selector:
    43. matchLabels:
    44. app: zabbixdb
    45. strategy: {}
    46. template:
    47. metadata:
    48. labels:
    49. app: zabbixdb
    50. spec:
    51. volumes:
    52. - name: zabbixdb-data
    53. persistentVolumeClaim:
    54. claimName: zabbixdb-pvc
    55. containers:
    56. - image: mysql:8.0
    57. name: mysql
    58. ports:
    59. - name: mysql
    60. containerPort: 3306
    61. protocol: TCP
    62. volumeMounts:
    63. - name: zabbixdb-data
    64. mountPath: /var/lib/mysql
    65. env:
    66. - name: MYSQL_USER
    67. value: 'zabbix'
    68. - name: MYSQL_PASSWORD
    69. value: 'zabbix'
    70. - name: MYSQL_ROOT_PASSWORD
    71. value: 'zabbix'
    72. ---
    73. apiVersion: v1
    74. kind: Service
    75. metadata:
    76. creationTimestamp: null
    77. labels:
    78. app: zabbixdb
    79. name: zabbixdb
    80. namespace: zabbix
    81. spec:
    82. clusterIP: 10.96.1.99
    83. ports:
    84. - name: 3306-3306
    85. port: 3306
    86. protocol: TCP
    87. targetPort: 3306
    88. selector:
    89. app: zabbixdb
    90. type: ClusterIP
    91. status:
    92. loadBalancer: {}

     部署

    kubectl apply -f zabbix_mysql.yaml 

    2、部署 zabbix-server

    固定运行节点

    运行

    kubectl label nodes k8s-master01  zabbix-server=true

    vi zabbix_server.yaml

    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4. creationTimestamp: null
    5. labels:
    6. app: zabbix-server
    7. name: zabbix-server
    8. namespace: zabbix
    9. spec:
    10. replicas: 1
    11. selector:
    12. matchLabels:
    13. app: zabbix-server
    14. strategy: {}
    15. template:
    16. metadata:
    17. creationTimestamp: null
    18. labels:
    19. app: zabbix-server
    20. spec:
    21. volumes:
    22. - name: zabbix-scripts
    23. hostPath:
    24. path: /usr/lib/zabbix/
    25. - name: zabbix-file
    26. hostPath:
    27. path: /var/lib/zabbix
    28. nodeSelector:
    29. zabbix-server: "true"
    30. initContainers:
    31. - name: zabbix-db-init
    32. image: zabbix/zabbix-server-mysql:6.0-ubuntu-latest
    33. command:
    34. - sh
    35. - -c
    36. - |
    37. sleep 30
    38. if ! mysql -u root -pzabbix -h 10.96.1.99 -P3306 --skip-column-names -e "SELECT COUNT(*) FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = 'zabbix';" 2>/dev/null | grep -q '^1'; then
    39. echo "CREATE DATABASE zabbix charset utf8 collate utf8_bin;" | mysql -u root -pzabbix -h 10.96.1.99 -P3306
    40. sleep 1s
    41. echo "CREATE DATABASE zabbix1 charset utf8 collate utf8_bin;" | mysql -u root -pzabbix -h 10.96.1.99 -P3306
    42. mysql -u root -pzabbix -h 10.96.1.99 -P3306 -e "USE zabbix; GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'%';";
    43. else
    44. if mysql -u root -pzabbix -h 10.96.1.99 -P3306 --skip-column-names -D zabbix -e "SELECT COUNT(*) FROM zabbix.users;" 2>/dev/null | grep -q '^0'; then
    45. echo "DROP DATABASE IF EXISTS zabbix;" | mysql -u root -pzabbix -h 10.96.1.99 -P3306
    46. sleep 1s
    47. echo "CREATE DATABASE zabbix charset utf8 collate utf8_bin;" | mysql -u root -pzabbix -h 10.96.1.99 -P3306
    48. sleep 1s
    49. echo "CREATE DATABASE zabbix1 charset utf8 collate utf8_bin;" | mysql -u root -pzabbix -h 10.96.1.99 -P3306
    50. fi
    51. fi
    52. if ! mysql -u root -pzabbix -h 10.96.1.99 -P3306 -e "USE zabbix; DESCRIBE users;"; then
    53. { zcat /usr/share/doc/zabbix-server-mysql/create.sql.gz | tee -a zcat_mysql.log; } | mysql -u root -pzabbix -h 10.96.1.99 -P3306 zabbix >> zcat_mysql.log
    54. fi #初次自动导入sql包到数据库的时候是有问题的,需要删除表后重新导入
    55. containers:
    56. - image: zabbix/zabbix-server-mysql:6.0-ubuntu-latest
    57. name: zabbix-server-mysql
    58. env:
    59. - name: DB_SERVER_HOST
    60. value: zabbixdb.zabbix.svc.cluster.local
    61. - name: MYSQL_USER
    62. value: zabbix
    63. - name: MYSQL_PASSWORD
    64. value: zabbix
    65. resources: {}
    66. ports:
    67. - containerPort: 10051
    68. hostPort: 10051
    69. status: {}
    70. ---
    71. apiVersion: v1
    72. kind: Service
    73. metadata:
    74. creationTimestamp: null
    75. labels:
    76. app: zabbix-server
    77. name: zabbix-server
    78. namespace: zabbix
    79. spec:
    80. ports:
    81. - name: 10051-10051
    82. port: 10051
    83. protocol: TCP
    84. targetPort: 10051
    85. selector:
    86. app: zabbix-server
    87. type: ClusterIP
    88. status:
    89. loadBalancer: {}

    部署

    1. kubectl apply -f zabbix_server.yaml
    2. kubectl -n zabbix get pod

    检查数据库是否有用户

    1. kubectl -n zabbix exec -it zabbixdb-5949d4d487-ld58v bash
    2. mysql -uroot -pzabbix
    3. select * from zabbix.users;

    3、部署zabbix-web

    vi zabbix_web.yaml

    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4. creationTimestamp: null
    5. labels:
    6. app: zabbix-web
    7. name: zabbix-web
    8. namespace: zabbix
    9. spec:
    10. replicas: 1
    11. selector:
    12. matchLabels:
    13. app: zabbix-web
    14. strategy: {}
    15. template:
    16. metadata:
    17. creationTimestamp: null
    18. labels:
    19. app: zabbix-web
    20. spec:
    21. containers:
    22. - image: zabbix/zabbix-web-nginx-mysql:6.0-ubuntu-latest
    23. name: zabbix-web-nginx-mysql
    24. env:
    25. - name: DB_SERVER_HOST
    26. value: zabbixdb.zabbix.svc.cluster.local
    27. - name: MYSQL_USER
    28. value: zabbix
    29. - name: MYSQL_PASSWORD
    30. value: zabbix
    31. - name: ZBX_SERVER_HOST
    32. value: 10.0.16.15
    33. - name: PHP_TZ
    34. value: Asia/shanghai
    35. resources: {}
    36. status: {}
    37. ---
    38. apiVersion: v1
    39. kind: Service
    40. metadata:
    41. creationTimestamp: null
    42. labels:
    43. app: zabbix-web
    44. name: zabbix-web
    45. namespace: zabbix
    46. spec:
    47. ports:
    48. - name: 8080-8080
    49. port: 8080
    50. protocol: TCP
    51. targetPort: 8080
    52. nodePort: 30011
    53. selector:
    54. app: zabbix-web
    55. type: NodePort
    56. status:
    57. loadBalancer: {}

    部署

    kubectl apply -f zabbix_web.yaml

    4、部署zabbix-agent

    vi zabbix_agent.yaml

    1. apiVersion: apps/v1
    2. kind: DaemonSet
    3. metadata:
    4. labels:
    5. app: zabbix-agent
    6. name: zabbix-agent
    7. namespace: zabbix
    8. spec:
    9. selector:
    10. matchLabels:
    11. app: zabbix-agent
    12. template:
    13. metadata:
    14. creationTimestamp: null
    15. labels:
    16. app: zabbix-agent
    17. spec:
    18. hostNetwork: true
    19. containers:
    20. - image: zabbix/zabbix-agent:6.0-ubuntu-latest
    21. name: zabbix-agent
    22. env:
    23. - name: ZBX_SERVER_HOST
    24. value: 10.0.16.15
    25. resources: {}

    部署

    kubectl apply -f zabbix_agent.yaml

    5、访问zabbix-ui

    1. http://101.43.156.78:30011 #nodeport暴露端口
    2. 账号 Admin #首字母大写
    3. 密码 zabbix

    6、导入mysql模板监控

    四、部署DNS

    1. 1、使用Deployment创建两个Pod,一个Pod为DNS主服务器,另一个Pod为DNS从服务器
    2. 2、DNS子域可以解析域名第一题中的ingress地址
    3. 3、单独创建一个pod,指定dns为dns从服务器,并且访问第一题中的域名要正常打开

    略,有空在看

  • 相关阅读:
    3172:练28.3 短信计费
    【FreeRTOS】【STM32】03 FreeRTOSConfig.h头文件简介与修改
    leetcode 22.8.5 只出现一次的数字
    python CV2库
    界面重建——Marching cubes算法
    算法学习笔记2023.1
    力扣题目训练(20)
    MySQL 是怎样使用的:从零蛋开始学习 MySQL
    系统架构设计师学习笔记——企业信息化战略与实施
    (多线程)并发编程的三大基础应用——阻塞队列、定时器、线程池【手搓源码】
  • 原文地址:https://blog.csdn.net/qq_42883074/article/details/132799578