资讯详情

kubernetes 实战案例(一)—微服务&&Ingress&&HPA

一、k8s 运行Redis 服务

通过数据数据pv/pvc结合NFS持久的服务器

1.1 redis镜像制作

环境准备 #制作镜像 FROM centos:7.8.2003  ADD redis-4.0.14.tar.gz /usr/local/src/ RUN ln -sv /usr/local/src/redis-4.0.14/ /usr/local/redis && mkdir /data/redis-data -p RUN yum -y install gcc automake autoconf libtool make && cd /usr/local/redis && make && make install   COPY redis.conf  /usr/local/redis/ ADD run.sh /scripts/run.sh  EXPOSE 6379  CMD [ "/scripts/run.sh" ]  #redis的配置文件 root@master1:~/server/scripts/Dockerfile/redis# cat redis.conf |grep -v "^$"|grep -v "#" bind 127.0.0.1 protected-mode yes port 6379 tcp-backlog 511 timeout 0 tcp-keepalive 300 daemonize no supervised no pidfile /var/run/redis_6379.pid loglevel notice logfile "" databases 16 always-show-logo yes save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename dump.rdb dir /data/redis-data    ######主要修改此目录 slave-serve-stale-data yes slave-read-only yes repl-diskless-sync no repl-diskless-sync-delay 5 repl-disable-tcp-nodelay no slave-priority 100 lazyfree-lazy-eviction no lazyfree-lazy-expire no lazyfree-lazy-server-del no slave-lazy-flush no appendonly no appendfilename "appendonly.aof" appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes aof-use-rdb-preamble no lua-time-limit 5000 slowlog-log-slower-than 10000 slowlog-max-len 128 latency-monitor-threshold 0 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-size -2 list-compress-depth 0 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 aof-rewrite-incremental-fsync yes #redis启动脚本 root@master1:~/server/scripts/Dockerfile/redis# cat run.sh #!/bin/bash redis-server /usr/local/redis/redis.conf tail -f /etc/hosts #构建进行上传到harbor root@master1:~/server/scripts/Dockerfile/redis# cat run-redis.sh #!/bin/bash docker build -t 10.0.0.104/baseimages/redis:v6.0.9 . sleep 1 docker push 10.0.0.104/baseimages/redis:v6.0.9 #进行构建 root@master1:~/server/scripts/Dockerfile/redis# bash run-redis.sh 

1.2 创建PV,PVC

1.2.1 创建pv

#pv配置文件
root@master1:~/server/yaml/redis# cat redis-pv.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: redis-datadir-pv-1
  namespace: test
spec:
  capacity: #当前pv大小
    storage: 10Gi
  accessModes: #访问模式
  - ReadWriteOnce
  nfs:
    path: /data/k8sdata/test/redis-datadir-1
    server: 10.0.0.111

#进行创建
root@master1:~/server/yaml/redis# kubectl apply -f redis-pv.yaml

#检验
root@master1:~/server/yaml/redis# kubectl get pv -n test
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                    STORAGECLASS                REASON   AGE
redis-datadir-pv-1                         10Gi       RWO            Retain           Available                                                                 97s

1.2.2 创建PVC

#pvc的配置文件
root@master1:~/server/yaml/redis# cat redis-pvc.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: redis-datadir-pvc-1
  namespace: test
spec:
  volumeName: redis-datadir-pv-1 #要绑定的PV名称
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
#进行创建
root@master1:~/server/yaml/redis# kubectl apply -f redis-pvc.yaml 
persistentvolumeclaim/redis-datadir-pvc-1 created

#验证
root@master1:~/server/yaml/redis# kubectl get pvc -n test
NAME                  STATUS   VOLUME               CAPACITY   ACCESS MODES   STORAGECLASS   AGE
redis-datadir-pvc-1   Bound    redis-datadir-pv-1   10Gi       RWO                           2m14s

1.3 创建deployment

#redis deployment配置文件
root@master1:~/server/yaml/redis# cat redis-deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name:  redis-deploy
  namespace: test
  labels:
    app:  redis-deploy
spec:
  selector:
    matchLabels:
      app: redis-deploy
  replicas: 1
  template:
    metadata:
      labels:
        app:  redis-deploy
    spec:
      containers:
      - name: redis-container
        image:  10.0.0.104/baseimages/redis:v6.0.9
        imagePullPolicy: Always
        volumeMounts:
        - name: redis-datadir
          mountPath: "/data/redis-data"
      volumes:
        - name: redis-datadir
          persistentVolumeClaim:
            claimName: redis-datadir-pvc-1

---

apiVersion: v1
kind: Service
metadata:
  name: redis-svc
  namespace: test
spec:
  selector:
    app: redis-deploy
  type: NodePort
  ports:
  - name: http
    port: 6379
    targetPort: 6379
    nodePort: 36379
  sessionAffinity: ClientIP
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 10800

#启动服务
root@master1:~/server/yaml/redis# kubectl apply -f redis-deployment.yaml 
deployment.apps/redis-deploy unchanged
service/redis-svc created
root@master1:~/server/yaml/redis# kubectl get svc -n test
NAME         TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
nginx-svc    NodePort   10.100.251.254   <none>        85:30010/TCP     2d3h
redis-svc    NodePort   10.100.67.152    <none>        6379:36379/TCP   9s
tomcat-svc   NodePort   10.100.60.137    <none>        80:30004/TCP     2d22h

#进行验证
root@master1:~/server/yaml/redis# kubectl get pod -n test
NAME                            READY   STATUS    RESTARTS   AGE
redis-deploy-67bf94579b-cgjpl   1/1     Running   0          96s

root@master1:~/server/yaml/redis# kubectl exec -it deploy/redis-deploy -n test bash 
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
[root@redis-deploy-67bf94579b-cgjpl /]# ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 07:53 ?        00:00:00 /bin/bash /scripts/run.sh
root           6       1  0 07:53 ?        00:00:00 redis-server 127.0.0.1:6379
root          10       0  0 07:54 pts/0    00:00:00 bash
root          24      10  0 07:54 pts/0    00:00:00 ps -ef
[root@redis-deploy-67bf94579b-cgjpl /]# df -h
Filesystem                                     Size  Used Avail Use% Mounted on
10.0.0.111:/data/k8sdata/test/redis-datadir-1   19G  8.4G  9.3G  48% /data/redis-data

[root@redis-deploy-67bf94579b-cgjpl /]# redis-cli -h 127.0.0.1
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> get k2
"v2"
127.0.0.1:6379> bgsave
Background saving started
[root@redis-deploy-67bf94579b-cgjpl /]# ll /data/redis-data/
total 4
-rw-r--r-- 1 root root 112 Oct 29 07:55 dump.rdb

#查询nfs上面的数据
root@node1:~# ll /data/k8sdata/test/redis-datadir-1/
total 12
drwxr-xr-x 2 root root 4096 Oct 29 15:55 ./
drwxr-xr-x 4 root root 4096 Oct 29 15:51 ../
-rw-r--r-- 1 root root  112 Oct 29 15:55 dump.rdb

二、mysql 主从复制

参考自:https://kubernetes.io/zh/docs/tasks/run-application/run-replicated-stateful-application/

2.1环境准备

root@master1:~# docker pull mysql:5.7
root@master1:~# docker tag mysql:5.7 10.0.0.104/baseimages/mysql:5.7
root@master1:~# docker push 10.0.0.104/baseimages/mysql:5.7
root@master1:~#  docker pull registry.cn-hangzhou.aliyuncs.com/hxpdocker/xtrabackup:1.0
root@master1:~#  docker tag registry.cn-hangzhou.aliyuncs.com/hxpdocker/xtrabackup:1.0 10.0.0.104/baseimages/xtrabackup:1.0
root@master1:~# docker push 10.0.0.104/baseimages/xtrabackup:1.0

2.2 创建 ConfigMap

root@master1:~/yaml/mysql# vim mysql-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql
  labels:
    app: mysql
data:
  master.cnf: |
    # Apply this config only on the master.
    [mysqld]
    log-bin
    log_bin_trust_function_creators=1
    lower_case_table_names=1
  slave.cnf: |
    # Apply this config only on slaves.
    [mysqld]
    super-read-only
    super-read-only
    log_bin_trust_function_creators=1

2.3 创建PV

root@master1:~/yaml/mysql# vim mysql-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-data-dir-1
spec:
  capacity:
    storage: 50Gi
  accessModes:
  - ReadWriteOnce
  nfs: 
    path: /data/k8sdata/mysql-data-dir-1
    server: 10.0.0.109

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-data-dir-2
spec:
  capacity:
    storage: 50Gi
  accessModes:
  - ReadWriteOnce
  nfs: 
    path: /data/k8sdata/mysql-data-dir-2
    server: 10.0.0.109
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-data-dir-3
spec:
  capacity:
    storage: 50Gi
  accessModes:
  - ReadWriteOnce
  nfs: 
    path: /data/k8sdata/mysql-data-dir-3
    server: 10.0.0.109

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-data-dir-4
spec:
  capacity:
    storage: 50Gi
  accessModes:
  - ReadWriteOnce
  nfs: 
    path: /data/k8sdata/mysql-data-dir-4
    server: 10.0.0.109

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-data-dir-5
spec:
  capacity:
    storage: 50Gi
  accessModes:
  - ReadWriteOnce
  nfs: 
    path: /data/k8sdata/mysql-data-dir-5
    server: 10.0.0.109

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-data-dir-6
spec:
  capacity:
    storage: 50Gi
  accessModes:
  - ReadWriteOnce
  nfs: 
    path: /data/k8sdata/mysql-data-dir-6
    server: 10.0.0.109

2.3 创建服务

root@master1:~/yaml/mysql# vim mysql-services.yaml
apiVersion: v1
kind: Service
metadata:
  name: mysql
  labels:
    app: mysql
spec:
  ports:
  - name: mysql
    port: 3306
  clusterIP: None
  selector:
    app: mysql
---
# Client service for connecting to any MySQL instance for reads.
# For writes, you must instead connect to the master: mysql-0.mysql.
apiVersion: v1
kind: Service
metadata:
  name: mysql-read
  labels:
    app: mysql
spec:
  ports:
  - name: mysql
    port: 3306
  selector:
    app: mysql

2.4 创建statefulset

#root@master1:~/yaml/mysql# vim mysql-statefulset.yaml 
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  serviceName: mysql
  replicas: 3
  template:
    metadata:
      labels:
        app: mysql
    spec:
      initContainers:   
      - name: init-mysql
        image: 10.0.0.104/baseimages/mysql:5.7  #修改为自己harbor仓库镜像
        command:
        - bash
        - "-c"
        - |
          set -ex
          # Generate mysql server-id from pod ordinal index.
          [[ `hostname` =~ -([0-9]+)$ ]] || exit 1
          ordinal=${ 
        BASH_REMATCH[1]}
          echo [mysqld] > /mnt/conf.d/server-id.cnf
          # Add an offset to avoid reserved server-id=0 value.
          echo server-id=$((100 + $ordinal)) >> /mnt/conf.d/server-id.cnf
          # Copy appropriate conf.d files from config-map to emptyDir.
          if [[ $ordinal -eq 0 ]]; then
            cp /mnt/config-map/master.cnf /mnt/conf.d/
          else
            cp /mnt/config-map/slave.cnf /mnt/conf.d/
          fi
        volumeMounts:
        - name: conf
          mountPath: /mnt/conf.d
        - name: config-map
          mountPath: /mnt/config-map
      - name: clone-mysql 
        image: 10.0.0.104/baseimages/xtrabackup:1.0 #修改为自己harbor仓库镜像
        command:
        - bash
        - "-c"
        - |
          set -ex
          # Skip the clone if data already exists.
          [[ -d /var/lib/mysql/mysql ]] && exit 0
          # Skip the clone on master (ordinal index 0).
          [[ `hostname` =~ -([0-9]+)$ ]] || exit 1
          ordinal=${ 
        BASH_REMATCH[1]}
          [[ $ordinal -eq 0 ]] && exit 0
          # Clone data from previous peer.
          ncat --recv-only mysql-$(($ordinal-1)).mysql 3307 | xbstream -x -C /var/lib/mysql
          # Prepare the backup.
          xtrabackup --prepare --target-dir=/var/lib/mysql
        volumeMounts:
        - name: data
          mountPath: /var/lib/mysql
          subPath: mysql
        - name: conf
          mountPath: /etc/mysql/conf.d
      containers:
      - name: mysql
        image: 10.0.0.104/baseimages/mysql:5.7
        env:
        - name: MYSQL_ALLOW_EMPTY_PASSWORD
          value: "1"
        ports:
        - name: mysql
          containerPort: 3306
        volumeMounts:
        - name: data
          mountPath: /var/lib
        标签: 连接器xf3h

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

 锐单商城 - 一站式电子元器件采购平台  

 深圳锐单电子有限公司