当前位置: 首页 > news >正文

kubernetes进阶 (三) 基础练习

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

一、镜像构建部署lnmp

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

0、docker镜像加速配置留存

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

vi /etc/docker/daemon.json

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

1、构建php镜像

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

vi Dockerfile

FROM centos:7.4.1708
ADD php-7.1.10.tar.gz /opt
RUN yum -y install gcc gcc-c++ make gd-devel libxml2-devel libcurl-devel libjpeg-devel libpng-devel openssl-devel bison \&& mkdir -p /usr/local/php/etc \&& cd /opt/php-7.1.10/ \&& ./configure --prefix=/usr/local/php \--with-config-file-path=/usr/local/php/etc \--with-gd --with-mysqli \--with-openssl --with-zlib --with-curl \--with-jpeg-dir --with-png-dir --with-iconv \--enable-fpm --enable-zip --enable-mbstring \&& make -j 2 \&& make install \&& cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf \&& cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf \&& sed -i '/;daemonize/a\daemonize = no' /usr/local/php/etc/php-fpm.conf \&& sed -i 's/127.0.0.1/0.0.0.0/g' /usr/local/php/etc/php-fpm.d/www.conf \&& echo "${TIME_ZOME}" > /etc/timezone \&& ln -sf /usr/share/zoneinfo/${TIME_ZOME} /etc/localtime \&& rm -rf /opt/local/php* \&& yum clean all \&& yum -y remove gcc gcc-c++ make \&& mkdir -p /usr/local/nginx/html \&& echo -e "<?php\nphpinfo();\n?>" > /usr/local/nginx/html/index.phpWORKDIR /usr/local/php/
EXPOSE 9000
CMD ["sbin/php-fpm","-c","etc/php-fpm.conf"]

构建

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

2、构建mysql镜像

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

 vi Dockerfile

FROM centos:7.4.1708
ADD mysql-5.6.26.tar.gz /opt
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo \&&  useradd -s /sbin/nologin mysql \&& yum -y install gcc gcc-c++ make pcre-devel expat-devel perl ncurses-devel autoconf cmake \&& cd /opt/mysql-5.6.26/ \&& 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 \&& make -j2 \&& make install \&& cp -f support-files/my-default.cnf /etc/my.cnf \&& cp support-files/mysql.server /etc/init.d/mysqld \&& chown -R mysql:mysql /usr/local/mysql/ \&& sed -i 's/^basedir/basedir=\/usr\/local\/mysql/g' /etc/init.d/mysqld \&& sed -i 's/^datadir/datadir=\/home\/mysql/g' /etc/init.d/mysqld \&& /usr/local/mysql/scripts/mysql_install_db --user=mysql --ldata=/var/lib/mysql --basedir=/usr/local/mysql --datadir=/home/mysql
ENV PATH /usr/local/mysql/bin:$PATH
EXPOSE 3306
ENTRYPOINT ["/usr/local/mysql/bin/mysqld_safe"]

构建

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

3、构建nginx镜像

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

vi Dockerfile

FROM centos:7.4.1708
ADD nginx-1.12.0.tar.gz /opt
RUN yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make \&& useradd -M -s /sbin/nologin nginx \&& cd /opt/nginx-1.12.0/ \&& ./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 \&& make \&& make install \&& ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx \&& 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 
ENV PATH /usr/local/nginx/sbin:$PATH
WORKDIR /usr/local/nginx/
EXPOSE 80
CMD ["nginx","-g","daemon off;"]

构建

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

 

4、部署lnmp

#主页文件挂在路径
/usr/local/nginx/html#配置文件路径
/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

apiVersion: apps/v1
kind: Deployment
metadata:name: my-deployment
spec:replicas: 1selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: nginx-containerimage: lnmp/nginx:v1volumeMounts:- name: data-volumemountPath: /usr/local/nginx/html- name: config-volumemountPath: /usr/local/nginx/conf/nginx.confsubPath: nginx.conf- name: php-containerimage: lnmp/php:v1volumeMounts:- name: data-volumemountPath: /usr/local/nginx/html- name: mysql-containerimage: lnmp/mysql:v1env:- name: MYSQL_ROOT_PASSWORD  #mysqlroot密码 valueFrom:secretKeyRef:name: mysql-passkey: password       #Passwd123- name: MYSQL_DATABASE  #默认的库valueFrom:secretKeyRef:name: mysql-passkey: database    #tmp- name: MYSQL_USERvalue: sun   #默认用户- name: MYSQL_PASSWORDvalueFrom:secretKeyRef:name: mysql-passkey: passwd   #默认密码  123volumes:- name: data-volumehostPath:path: /apps/data/- name: config-volumeconfigMap:name: nginx-configmapitems:- key: nginx.confpath: nginx.conf---
apiVersion: v1
kind: Service
metadata:name: nginx-php-mysql
spec:type: NodePortports:- name: nginxport: 80protocol: TCPtargetPort: 80nodePort: 30010selector:app: my-app
---
apiVersion: v1
kind: ConfigMap
metadata:name: nginx-configmap
data:nginx.conf: |events {use epoll;worker_connections 1024;}http {server_tokens on;server {listen 80;server_name localhost;location / {root html;index index.html index.htmi index.php;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}location ~ \.php$ {root html;fastcgi_pass localhost:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}}}

部署

kubectl apply -f lnmp.yaml

5、配置php访问页面

vi /apps/data/index.php

<?phpphpinfo();
?>

访问

http://101.43.156.78:30010/index.php

6、配置php链接mysql测试

vi /apps/data/conn.php

<?php
$link=mysqli_connect('localhost:3306','sun','123');
if($link) echo "数据库链接成功";
mysqli_close($link);
?>

mysql授权

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

访问

http://101.43.156.78:30010/conn.php

7、配置ingress控制器

安装

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

替换镜像

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
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

添加主机网络模式

awk '/containers:/ {print "      hostNetwork: true"} 1' deploy.yaml > ingress-controller.yaml
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

apiVersion: apps/v1
kind: Deployment
metadata:name: default-http-backendlabels:k8s-app: default-http-backendnamespace: kube-system
spec:replicas: 1selector:matchLabels:k8s-app: default-http-backendtemplate:metadata:labels:k8s-app: default-http-backendspec:terminationGracePeriodSeconds: 60containers:- name: default-http-backend# Any image is permissable as long as:# 1. It serves a 404 page at /# 2. It serves 200 on a /healthz endpointimage: registry.cn-hangzhou.aliyuncs.com/hachikou/defaultbackend:1.0livenessProbe:httpGet:path: /healthz   #这个URI是 nginx-ingress-controller中nginx里配置好的localtion port: 8080scheme: HTTPinitialDelaySeconds: 30   #30s检测一次/healthztimeoutSeconds: 5ports:- containerPort: 8080
#        resources:
#          limits:
#            cpu: 10m
#            memory: 20Mi
#          requests:
#            cpu: 10m
#            memory: 20Mi
---
apiVersion: v1
kind: Service     #为default backend 创建一个service
metadata:name: default-http-backendnamespace: kube-systemlabels:k8s-app: default-http-backend
spec:ports:- port: 80targetPort: 8080selector:k8s-app: default-http-backend

部署

kubectl apply -f http-backend.yaml

 9、添加ingress-nginx规则

vi ingress-nginx.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: nginx
spec:ingressClassName: nginxrules:- host: www.han.comhttp:paths:- path: /pathType: Prefixbackend:service:name: nginx-php-mysqlport: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、使用statefulset 控制器部署mysql:8.0 要求副本数为2,且为主从关系
2、使用无头svc 发布,名称为mysql-headless
3、使用ingress发布mysql  端口为30012
4、使用动态存储卷(nfs),存储mysql数据

0、准备nfs共享

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

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

1、创建持久卷

cd /apps/mysql_master_slave

vi mysql-pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:name: pv-a  # 为持久化卷A指定名称
spec:capacity:storage: 1GiaccessModes:- ReadWriteOnce- ReadOnlyManypersistentVolumeReclaimPolicy: Recyclenfs:server: 10.0.16.15path: /apps/mysql_master_slave/data/mysql-0  # 指定NFS路径---apiVersion: v1
kind: PersistentVolume
metadata:name: pv-b  # 为持久化卷B指定名称
spec:capacity:storage: 1GiaccessModes:- ReadWriteOnce- ReadOnlyManypersistentVolumeReclaimPolicy: Recyclenfs:server: 10.0.16.15path: /apps/mysql_master_slave/data/mysql-1  # 指定NFS路径

部署

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

 2、编辑mysql主从配置

vi mysql-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:name: mysqllabels:app: mysql
data:master.cnf: |# Apply this config only on the master.[mysqld]log-binslave.cnf: |# Apply this config only on slaves.[mysqld]super-read-only

部署

kubectl apply -f mysql-configmap.yaml

3、部署无头svc

vi mysql-headless-svc.yaml

apiVersion: v1
kind: Service
metadata:name: mysql-headlesslabels:app: mysql
spec:ports:- name: mysqlport: 3306clusterIP: Noneselector:app: mysql

部署

kubectl apply -f mysql-headless-svc.yaml

4、部署mysql服务

vi mysql-sts.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysql-ss
spec:selector:matchLabels:app: mysqlserviceName: mysql-headlessreplicas: 2template:metadata:labels:app: mysqlspec:initContainers:- name: init-mysqlimage: mysql:8.0.18command:- bash- "-c"- |set ex[[ `hostname` =~ -([0-9]+)$ ]] || exit 1ordinal=${BASH_REMATCH[1]}echo [mysqld] > /mnt/conf.d/server-id.cnfecho server-id=$((100 + $ordinal)) >> /mnt/conf.d/server-id.cnfif [[ $ordinal -eq 0 ]]; thencp /mnt/config-map/master.cnf /mnt/conf.d/elsecp /mnt/config-map/slave.cnf /mnt/conf.d/fivolumeMounts:- name: confmountPath: /mnt/conf.d- name: config-mapmountPath: /mnt/config-map- name: clone-mysqlimage: jstang/xtrabackup:2.3command:- bash- "-c"- |set -ex[[ -d /var/lib/mysql/mysql ]] && exit 0[[ `hostname` =~ -([0-9]+)$ ]] || exit 1ordinal=${BASH_REMATCH[1]}[[ $ordinal -eq 0 ]] && exit 0ncat --recv-only mysql-ss-$(($ordinal-1)).mysql-headless 3307 | xbstream -x -C /var/lib/mysqlxtrabackup --prepare --target-dir=/var/lib/mysqlvolumeMounts:- name: datamountPath: /var/lib/mysqlsubPath: mysql- name: confmountPath: /etc/mysql/conf.dcontainers:- name: mysqlimage: mysql:8.0.18args: ["--default-authentication-plugin=mysql_native_password"]env:- name: MYSQL_ALLOW_EMPTY_PASSWORDvalue: "1"ports:- name: mysqlcontainerPort: 3306volumeMounts:- name: datamountPath: /var/lib/mysqlsubPath: mysql- name: confmountPath: /etc/mysql/conf.dresources:requests:cpu: 50mmemory: 50MilivenessProbe:exec:command: ["mysqladmin", "ping"]initialDelaySeconds: 30periodSeconds: 10timeoutSeconds: 5readinessProbe:exec:command: ["mysql", "-h", "127.0.0.1", "-e", "SELECT 1"]initialDelaySeconds: 5periodSeconds: 2timeoutSeconds: 1- name: xtrabackupimage: jstang/xtrabackup:2.3ports:- name: xtrabackupcontainerPort: 3307command:- bash- "-c"- |set -excd /var/lib/mysqlif [[ -s xtrabackup_slave_info ]]; thenmv xtrabackup_slave_info change_master_to.sql.inrm -f xtrabackup_binlog_infoelif [[ -f xtrabackup_binlog_info ]]; then[[ `cat xtrabackup_binlog_info` =~ ^(.*?)[[:space:]]+(.*?)$ ]] || exit 1rm xtrabackup_binlog_infoecho "CHANGE MASTER TO MASTER_LOG_FILE='${BASH_REMATCH[1]}',\ MASTER_LOG_POS=${BASH_REMATCH[2]}" > change_master_to.sql.infisleep 10sif [[ -f change_master_to.sql.in ]]; thenecho "Waiting for mysqld to be ready (accepting connections)"until mysql -h 127.0.0.1 -e "SELECT 1"; do sleep 1; doneecho "Initializing replication from clone position"mv change_master_to.sql.in change_master_to.sql.origsed 's/\\//' change_master_to.sql.origmysql -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;"fiexec ncat --listen --keep-open --send-only --max-conns=1 3307 -c "xtrabackup --backup --slave-info --stream=xbstream --host=127.0.0.1 --user=root"volumeMounts:- name: datamountPath: /var/lib/mysqlsubPath: mysql- name: confmountPath: /etc/mysql/conf.dresources:requests:cpu: 10mmemory: 10Mivolumes:- name: confemptyDir: {}- name: config-mapconfigMap:name: mysqlvolumeClaimTemplates:- metadata:name: dataspec:accessModes:- ReadWriteOnceresources:requests:storage: 0.1Gi

部署

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

5、验证mysql主从是否正常

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

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

#数据库1
create database ui;
create table ui.user(name varchar(255));
insert into ui.user(name) values("jstang");#数据库2
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

    spec:hostNetwork: truecontainers:- args:- /nginx-ingress-controller- --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services  #添加- --udp-services-configmap=$(POD_NAMESPACE)/udp-services   #添加

vi tcp-services.yaml

apiVersion: v1
kind: ConfigMap
metadata:name: tcp-servicesnamespace: default
data:3306: "default/mysql-headless:3306"

kubectl apply -f tcp-services.yaml

kubectl edit service ingress-nginx-controller -n ingress-nginx
  - name: tcp-service-3306port: 3306protocol: TCPtargetPort: 3306#添加上述信息selector:app.kubernetes.io/component: controllerapp.kubernetes.io/instance: ingress-nginxapp.kubernetes.io/name: ingress-nginxsessionAffinity: Nonetype: LoadBalancer
status:loadBalancer: {}

三、 zabbix 监控

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

 0、准备nfs目录

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

 1、部署zabbix-mysql

cd /apps/zabbix
kubectl create namespace zabbix

vi zabbix_mysql.yaml

---
apiVersion: v1
kind: PersistentVolume
metadata:name: zabbixdb-pv
spec:capacity:   #创建存储的大小storage: 10GivolumeMode: Filesystem  #存储的类型accessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: Recyclenfs:path: /apps/zabbix/dataserver: 10.0.16.15   #修改mountOptions:- hard- nfsvers=4.1
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: zabbixdb-pvcnamespace: zabbix
spec:accessModes:- ReadWriteOncevolumeMode: Filesystem   #存储类型 ,块存储Blockresources:requests:storage: 8Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: zabbixdbname: zabbixdbnamespace: zabbix
spec:replicas: 1selector:matchLabels:app: zabbixdbstrategy: {}template:metadata:labels:app: zabbixdbspec:volumes:- name: zabbixdb-datapersistentVolumeClaim:claimName: zabbixdb-pvccontainers:- image: mysql:8.0name: mysqlports:- name: mysqlcontainerPort: 3306protocol: TCPvolumeMounts:- name: zabbixdb-datamountPath: /var/lib/mysqlenv:- name: MYSQL_USERvalue: 'zabbix'- name: MYSQL_PASSWORDvalue: 'zabbix'- name: MYSQL_ROOT_PASSWORDvalue: 'zabbix'
---apiVersion: v1
kind: Service
metadata:creationTimestamp: nulllabels:app: zabbixdbname: zabbixdbnamespace: zabbix
spec:clusterIP: 10.96.1.99ports:- name: 3306-3306port: 3306protocol: TCPtargetPort: 3306selector:app: zabbixdbtype: ClusterIP
status:loadBalancer: {}

 部署

kubectl apply -f zabbix_mysql.yaml 

2、部署 zabbix-server

固定运行节点

运行

kubectl label nodes k8s-master01  zabbix-server=true

vi zabbix_server.yaml

apiVersion: apps/v1
kind: Deployment
metadata:creationTimestamp: nulllabels:app: zabbix-servername: zabbix-servernamespace: zabbix
spec:replicas: 1selector:matchLabels:app: zabbix-serverstrategy: {}template:metadata:creationTimestamp: nulllabels:app: zabbix-serverspec:volumes:- name: zabbix-scriptshostPath:path: /usr/lib/zabbix/- name: zabbix-filehostPath:path: /var/lib/zabbixnodeSelector:zabbix-server: "true"initContainers:- name: zabbix-db-initimage: zabbix/zabbix-server-mysql:6.0-ubuntu-latestcommand:- sh- -c- |sleep 30if ! 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'; thenecho "CREATE DATABASE zabbix charset utf8 collate utf8_bin;" | mysql -u root -pzabbix -h 10.96.1.99 -P3306sleep 1secho "CREATE DATABASE zabbix1 charset utf8 collate utf8_bin;" | mysql -u root -pzabbix -h 10.96.1.99 -P3306mysql -u root -pzabbix -h 10.96.1.99 -P3306 -e "USE zabbix; GRANT ALL PRIVILEGES ON zabbix.* TO 'zabbix'@'%';";elseif 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'; thenecho "DROP DATABASE IF EXISTS zabbix;" | mysql -u root -pzabbix -h 10.96.1.99 -P3306sleep 1secho "CREATE DATABASE zabbix charset utf8 collate utf8_bin;" | mysql -u root -pzabbix -h 10.96.1.99 -P3306sleep 1secho "CREATE DATABASE zabbix1 charset utf8 collate utf8_bin;" | mysql -u root -pzabbix -h 10.96.1.99 -P3306fifiif ! mysql -u root -pzabbix -h 10.96.1.99 -P3306 -e "USE zabbix; DESCRIBE users;"; then{ 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.logfi #初次自动导入sql包到数据库的时候是有问题的,需要删除表后重新导入containers:- image: zabbix/zabbix-server-mysql:6.0-ubuntu-latestname: zabbix-server-mysqlenv:- name: DB_SERVER_HOSTvalue: zabbixdb.zabbix.svc.cluster.local- name: MYSQL_USERvalue: zabbix- name: MYSQL_PASSWORDvalue: zabbixresources: {}ports:- containerPort: 10051hostPort: 10051
status: {}---
apiVersion: v1
kind: Service
metadata:creationTimestamp: nulllabels:app: zabbix-servername: zabbix-servernamespace: zabbix
spec:ports:- name: 10051-10051port: 10051protocol: TCPtargetPort: 10051selector:app: zabbix-servertype: ClusterIP
status:loadBalancer: {}

部署

kubectl apply -f zabbix_server.yamlkubectl -n zabbix get pod

检查数据库是否有用户

kubectl -n zabbix exec -it zabbixdb-5949d4d487-ld58v bashmysql -uroot -pzabbixselect * from zabbix.users;

3、部署zabbix-web

vi zabbix_web.yaml

apiVersion: apps/v1
kind: Deployment
metadata:creationTimestamp: nulllabels:app: zabbix-webname: zabbix-webnamespace: zabbix
spec:replicas: 1selector:matchLabels:app: zabbix-webstrategy: {}template:metadata:creationTimestamp: nulllabels:app: zabbix-webspec:containers:- image: zabbix/zabbix-web-nginx-mysql:6.0-ubuntu-latestname: zabbix-web-nginx-mysqlenv:- name: DB_SERVER_HOSTvalue: zabbixdb.zabbix.svc.cluster.local- name: MYSQL_USERvalue: zabbix- name: MYSQL_PASSWORDvalue: zabbix- name: ZBX_SERVER_HOSTvalue: zabbix-server.zabbix.svc.cluster.local- name: PHP_TZvalue: Asia/shanghairesources: {}
status: {}
---
apiVersion: v1
kind: Service
metadata:creationTimestamp: nulllabels:app: zabbix-webname: zabbix-webnamespace: zabbix
spec:ports:- name: 8080-8080port: 8080protocol: TCPtargetPort: 8080nodePort: 30011selector:app: zabbix-webtype: NodePort
status:loadBalancer: {}

部署

kubectl apply -f zabbix_web.yaml

4、部署zabbix-agent

vi zabbix_agent.yaml

apiVersion: apps/v1
kind: DaemonSet
metadata:labels:app: zabbix-agentname: zabbix-agentnamespace: zabbix
spec:selector:matchLabels:app: zabbix-agenttemplate:metadata:creationTimestamp: nulllabels:app: zabbix-agentspec:hostNetwork: truecontainers:- image: zabbix/zabbix-agent:6.0-ubuntu-latestname: zabbix-agentenv:- name: ZBX_SERVER_HOSTvalue: zabbix-server.zabbix.svc.cluster.localresources: {}

部署

kubectl apply -f zabbix_agent.yaml

5、访问zabbix-ui

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

6、导入mysql模板监控

四、部署DNS

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

略,有空在看

相关文章:

kubernetes进阶 (三) 基础练习

前两天朋友给了我几道题&#xff0c;看着挺简单的&#xff0c;但实际做的时候发现坑不少&#xff0c;这里做下笔记 一、镜像构建部署lnmp 1、构建镜像 nginx、php、mysql 要求使用centos7作为基础镜像 2、使用deployment部署上面的容器,要求3个服务要放到一个pod中(虽然这样是…...

数据结构 排序

目录 第八章 排序8.1排序的基本概念1. 概念2. 排序算法的分类 8.2 插入排序8.2.1 直接插入排序8.2.2 算法效率分析8.2.2 折半插入排序总结8.2.3 希尔排序 8.3 交换排序8.3.1冒泡排序8.3.2快速排序&#xff08;了解栈的过程&#xff09; 8.4 选择排序8.4.1 简单选择排序8.4.2 堆…...

Cpp/Qtday050912cpp基础

目录 实现一个图形类&#xff08;Shape&#xff09;&#xff0c;包含受保护成员属性&#xff1a;周长、面积&#xff0c; 公共成员函数&#xff1a;特殊成员函数书写 定义一个圆形类&#xff08;Circle&#xff09;&#xff0c;继承自图形类&#xff0c;包含私有属性&#x…...

Git diff 使用 vimdiff 对比差异

在Ubuntu中使用Git时&#xff0c;可使用命令行的git diff命令来对比两次提交的差异&#xff0c;但是这种对比查看方式无法直观地查看修改的差异&#xff0c;在对比和查看时不太方便。 可以使用vimdiff作为Git diff的对比工具&#xff0c;这样就方便了许多&#xff0c;Git的配置…...

c小白勇闯结构体!!!!

目录 1.结构体类型的声明 1.结构的基础 2.结构体的声明 3.结构体成员的类型 4结构体变量的定义和初始化 2.结构体成员的访问 3.结构体传参 1.结构体类型的声明 1.结构的基础 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量 结构体变量的创…...

【DevOps核心理念基础】3. 敏捷开发最佳实践

一、敏捷开发最佳实践 1.1 项目管理 1.2 需求管理 1.3 技术架构 1.4 技术开发 1.5 测试 二、敏捷开发最佳实践 2.1 敏捷开发的执行细节 三、全面的DevOps工具链 四、版本控制和协作开发工具 4.1 集中式版本控制工具 4.2 分布式版本控制工具 一、敏捷开发最佳实践 …...

二进制、数位dp:0912T3

考虑题目转化&#xff0c;二进制下满足 i ⊆ j , ( i x ) ⊆ ( j y ) i\subseteq j,(ix)\subseteq (jy) i⊆j,(ix)⊆(jy) 这显然是个数位dp形式 考虑枚举每一位与进位&#xff0c; d p k , p 1 , p 2 dp_{k,p_1,p_2} dpk,p1​,p2​​ 表示第 k − 1 k-1 k−1 位向第 k k…...

Java基于SpringBoot+Vue的 4S店车辆管理系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1 简介2 技术栈3 功能总览4 系统设计4.1 系统设计主要功能4.2 数据库设计4.2.1 数据库设计规范4.2…...

助力智能化公路养护,基于YOLOv5s集成SPD-BIFPN-SE开发构建公路开裂检测识别系统

在前文中我们尝试构建了在隧道、涵洞尝尽下的自动智能化养护巡查相关的模型&#xff0c;进行了实地测试评估&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《基于轻量级YOLOv5s开发构建隧道基建裂痕、脱落等缺陷问题检测系统》 本文的想法是相近的&#xff0c;核心…...

C++--day5

实现一个图形类&#xff08;Shape&#xff09;&#xff0c;包含受保护成员属性&#xff1a;周长、面积&#xff0c; 公共成员函数&#xff1a;特殊成员函数书写 定义一个圆形类&#xff08;Circle&#xff09;&#xff0c;继承自图形类&#xff0c;包含私有属性&#xff1a;半…...

Django应用部署实战:从开发到生产,全程解析

部署架构图 版本说明 Centos 7.4 Python 3.6.4 Django 2.0.2 Channels 2.0.0 MySql 5.7 uWSGI Nginx 1.12.2 部署前 1、更新系统环境 yum install epel-release 2、安装所有的开发工具包 yum groupinstall -y “Development tools” 一、安装python 3.6.4 1、下载 cd /usr/…...

群晖NAS如何在内网部署HTTPS服务让浏览器信任证书

前言 最近在折腾内部部署Web服务。通过Vue实现一个H5的内部的管理服务。但在实际部署过程中由于种种原因&#xff0c;必须部署成Https服务。但在部署成Https服务后&#xff0c;由于没有HTTPS证书&#xff0c;每次进入页面都会被浏览器拦截。使用起来非常不便。于是开始各种Goo…...

crAPI靶场学习记录

靶场搭建 [靶场下载地址](我fork了一份) docker安装&#xff0c;笔者是用的wsldocker. [lab0:**初始账户 **] 注册一个账户&#xff0c;邮箱为[APIqq.com]&#xff0c;密码为Admin123 登陆后访问对应IP的8025端口&#xff0c;接收邮件获取车辆信息。 [lab1:**访问其它用户车…...

知识图谱实战应用28-基于py2neo的ICD-11疾病分类的知识图谱的查询与问答实战应用

大家好,我是微学AI,今天给大家介绍一下知识图谱实战应用28-基于py2neo的ICD-11疾病分类的知识图谱的查询与问答实战应用。使用基于py2neo的ICD-11疾病分类知识图谱,我们能够像探索一座生物医学宇宙般,穿梭在各种疾病之间。这个神奇的图谱可以帮助我们揭示各种疾病之间复杂而…...

20.Xaml GroupBox控件 ---->带标题的内容控件

1.运行效果 2.运行源码 a.Xaml源码 <Window x:Class="testView.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mic…...

基于CycleGAN的山水风格画迁移

基于CycleGAN的山水风格画迁移 1、简介 1.1 研究背景及意义 绘画是人类重要的一种艺术形式&#xff0c;其中中国的山水画源远流长&#xff0c;具有丰富的美学内涵&#xff0c;沉淀着中国人的情思。游山玩水的大陆文化意识&#xff0c;以山为德、水为性的内在修为意识&#x…...

​@Cacheable 注解​

1. 功能说明 Cacheable 注解在方法上&#xff0c;表示该方法的返回结果是可以缓存的。也就是说&#xff0c;该方法的返回结果会放在缓存中&#xff0c;以便于以后使用相同的参数调用该方法时&#xff0c;会返回缓存中的值&#xff0c;而不会实际执行该方法。 注意&#xff0c;这…...

vue3+ts项目打包后的本地访问

注意&#xff1a;打包之后不可直接点击html访问&#xff0c;需要给项目安装本地服务&#xff01; 1、安装servenpm i -g serve 2、打包项目npm run build 生成dist文件夹 3、本地访问serve dist 运行service dist之后的控制台 可复制下方的地址运行打包后的项目&#xff0c;运行…...

探索程序员需要掌握的算法?

文章目录 一&#xff1a;引言二&#xff1a;常见算法介绍三&#xff1a;重点算法总结 &#x1f389;欢迎来到数据结构学习专栏~探索程序员需要掌握的算法&#xff1f; ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f388;该系列文章…...

性能测试 —— Jmeter定时器

固定定时器 如果你需要让每个线程在请求之前按相同的指定时间停顿&#xff0c;那么可以使用这个定时器&#xff1b;需要注意的是&#xff0c;固定定时器的延时不会计入单个sampler的响应时间&#xff0c;但会计入事务控制器的时间 1、使用固定定时器位置在http请求中&#xf…...

mp4视频太大怎么压缩?几种常见压缩方法

mp4视频太大怎么压缩&#xff1f;科技的飞速发展使得视频成为人们生活中不可或缺的一部分。然而&#xff0c;随着视频质量的不断提高&#xff0c;视频文件的大小也与日俱增&#xff0c;给我们的存储和传输带来了巨大的挑战和困扰。特别是MP4格式的视频&#xff0c;由于其出色的…...

论文复制ChatGPT按钮被发表,撤回后再曝多个类似案例;Midjourney 生成大师级的人像

&#x1f989; AI新闻 &#x1f680; 论文复制ChatGPT按钮被发表&#xff0c;撤回后再曝多个类似案例 摘要&#xff1a;一篇物理论文复制了ChatGPT按钮内容&#xff0c;经过两个月同行评审并在杂志上发表。这一现象被知名打假人发现后&#xff0c;发表商决定撤回该论文。此外…...

Python自动化测试 史上最全的进阶教程

Python自动化测试就是把以前人为测试转化为机器测试的一种过程。自动化测试是一种比手工测试更快获得故障反馈的方法。 随着时代的变革&#xff0c;也许在未来测试这个职位的需求会越来越少甚至消失&#xff0c;但是每一个组织&#xff0c;每一个客户对软件质量的要求是永远不…...

centos pip失效

在 CentOS 上安装和配置 pip3 可能需要以下步骤&#xff1a; 确保 Python 3 已正确安装&#xff1a;请确保您已经正确地安装了 Python 3。在 CentOS 上&#xff0c;Python 3 可能默认安装在 /usr/bin/python3 路径下。您可以通过运行以下命令来验证 Python 3 是否正确安装&…...

Java——》ThreadLocal

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…...

如何做好利益相关方的期望管理?

利益相关方对项目而言非常重要&#xff0c;有效管理利益相关方的期望可以帮助项目团队更好地满足利益相关方的需求&#xff0c;助于建立良好的合作伙伴关系&#xff0c;提高项目的可持续性和成功率。 如果项目团队无法满足利益相关方的需求&#xff0c;可能会引发冲突、争议或其…...

【K8S系列】深入解析k8s网络插件—Canal

序言 做一件事并不难&#xff0c;难的是在于坚持。坚持一下也不难&#xff0c;难的是坚持到底。 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记论点蓝色&#xff1a;用来标记论点 在现代容器化应用程序的世界中…...

从单页面应用角度去解决不跳转页面,也能更改浏览器url地址

正常来说不刷新页面&#xff0c;也能更改浏览器url地址的方法有很多&#xff0c;我们在网上搜的话可以看到有pushState、replaceState、popstate等方法&#xff0c;那还有没有其他方法呢&#xff1f; 答案是有的&#xff01; 最近做一个vue商城项目的时候&#xff0c;用户点击支…...

Linux:keepalived + ipvsadm

介绍 Linux&#xff1a;keepalived 双热备份&#xff08;基础备份web&#xff09;_鲍海超-GNUBHCkalitarro的博客-CSDN博客https://blog.csdn.net/w14768855/article/details/132815057?spm1001.2014.3001.5501 环境 一台 centos7 keepalived ipvsadm &#xff08;主…...

Linux基础命令(示例代码 + 解释)

查看目录下文件 ls [-a -l -h] [路径] -a&#xff08;全部&#xff09; -l&#xff08;细节&#xff09; -h&#xff08;大小&#xff09; ls ls / ls -a ls -l ls -h ls -alh ls -l -h -a ls -lah /切换目录 cd [路径] change di…...

wordpress访客代码/网络营销推广策划的步骤是什么

开源不只在改变我们与世界互动的方式&#xff0c;它也在改变世界与我们互动的方式。体现这一点的案例便是&#xff1a;开源机器人。 机器人在我们的世界中正在扮演越来越重要的角色&#xff0c;尽管我们还没有实现在电视剧 Jetson 中的机器人管家那样的乌托邦式的未来&#xff…...

买域名送网站/交换链接营销成功案例

为什么要公开这些面试题&#xff1f; 原因一&#xff1a;身边从事 Java 开发的人员越来越多&#xff0c;我的表弟表妹们&#xff0c;朋友的表弟表妹们&#xff0c;朋友的朋友的表弟表妹们&#xff0c;每次问我要相同的面试复习材料&#xff0c;已经让我疲于应付&#xff0c;索…...

宣讲家网站李慎明两学一做/百度一下你就知道原版

[Icons] Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}";IconFilename:{app}\{#MyAppExeName}; Tasks: desktopicon; Check: canAddIcon...

做网站文字怎么围绕图片/百度竞价排名是什么意思

data class 相当于把JAVA中的toString方法复写了一遍 它更加易表现&#xff1a;这是它最重要的优点之一。你可以编写少得多的代码。 它更加安全&#xff1a;Kotlin是空安全的&#xff0c;也就是说在我们编译时期就处理了各种null的 情况&#xff0c;避免了执行时异常。如果一…...

简单的企业网站cms/洛阳网站建设优化

修改了my.cnf&#xff0c;需要重启MySQL服务由于是从源码包安装的Mysql&#xff0c;所以系统中是没有红帽常用的servcie mysqld restart这个脚本只好手工重启有人建议Killall mysql。这种野蛮的方法其实是不行的&#xff0c;强制终止的话&#xff0c;如果造成表损坏&#xff0c…...

拼多多网站在那里做/百度一下1688

比以前就多了一点&#xff1a; 创建多个缓冲区&#xff0c;传入到顶点着色器中&#xff1b; attribute float a_PointSize;//传入点的尺寸 gl_Position a_Position;//设置点的尺寸 用bufferData把数据给a_PointSize 如图&#xff1a; 具体代码如下&#xff1a; <!DOCTY…...