K8s应用

来自linux中国网wiki
Evan讨论 | 贡献2023年10月16日 (一) 14:22的版本 →‎2022 laravel
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索

Monitoring

如何以优雅的姿势监控kubernetes 集群服务

进阶

rancher

2022

K8S 部署电商项目

2022 laravel

放 mysql数据的 nfs data里面不能有文件  不然会报错 

log 如下 

2023-10-16 13:34:59+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.43-1.el7 started.
2023-10-16 13:35:04+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2023-10-16 13:35:04+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.43-1.el7 started.
2023-10-16 13:35:08+00:00 [Note] [Entrypoint]: Initializing database files
2023-10-16T13:35:08.154125Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2023-10-16T13:35:08.156183Z 0 [ERROR] --initialize specified but the data directory has files in it. Aborting.
2023-10-16T13:35:08.156235Z 0 [ERROR] Aborting

1. pv 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv01
  labels:
    pvname: pv01
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: /mydata/k8s
    server: 192.168.10.103


2. pvc 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-persistentvolumeclaim
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  selector:
    #matchLabels:
      #pvname: pv0001
    matchExpressions:
      - {key: pvname, operator: In, values: [pv01]}


3. mysql dp and service
kind: Deployment
apiVersion: apps/v1
metadata:
  name: mysql-deployment
  labels:
    app: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: mysql:5.7
          env:
            - name: MYSQL_ALLOW_EMPTY_PASSWORD
              value: 'true'
          ports:
            - containerPort: 3306
          volumeMounts:
            - mountPath: /var/lib/mysql
              name: mysql-storage
      volumes:
        - name: mysql-storage
          persistentVolumeClaim:
            claimName: mysql-persistentvolumeclaim

---
kind: Service
apiVersion: v1
metadata:
  name: mysql-service
  labels:
    app: mysql
spec:
  selector:
    app: mysql
  ports:
    - port: 3306
      targetPort: 3306



现在的 Demo 将 web 服务、定时任务还有队列监听都放在了一个 Pod 中,无法对其进行扩容(因为定时任务和队列监听会重复)。如果需要对 Laravel 应用进行 HPA 扩容的话,还需要对 Laravel 项目的 docker/entrypint.sh 进行一些改造。将上述的 laravel-deploment 拆分成 3 个 Deploment,将容器分为三个角色,分为是 web、cron、queue。分别提供 web 服务、定时任务以及队列监听。最后对提供 web 服务的 Deploment 设置 HPA,根据 cpu 或者 内存占用率进行自动扩容。

另外,定时任务也可以使用 Kubernetes 的 CronJob 对象来实现。



每天5分钟的,以前应该有笔记的吧 https://www.cnblogs.com/CloudMan6/p/8323420.html



用 Deployment 运行应用 - 每天5分钟玩转 Docker 容器技术(123)

Kubernetes存储体系 PV PVC

详解Kubernetes存储体系

kubernetes中服务的暴露访问方式

2. Loadbalancer 使用NodeIp+Nodeport的方式实现,利用云平台提供的loadbalance服务,像aws、azure、openstack、gce都提供了loadbalance服务

这里不做介绍了

3. Ingress Ingress 使用开源的反向代理负载均衡器来实现对外暴漏服务,比如 Nginx、Apache、Haproxy等。Nginx Ingress 一般有三个组件组成:

Nginx 反向代理负载均衡器 Ingress Controller 可以理解为控制器,它通过不断的跟 Kubernetes API 交互,实时获取后端 Service、Pod 等的变化,比如新增、删除等,然后结合 Ingress 定义的规则生成配置,然后动态更新上边的 Nginx 负载均衡器,并刷新使配置生效,来达到服务自动发现的作用。 Ingress 则是定义规则,通过它定义某个域名的请求过来之后转发到集群中指定的 Service。它可以通过 Yaml 文件定义,可以给一个或多个 Service 定义一个或多个 Ingress 规则。


kubernetes中服务的暴露访问方式kubernetes ingress使用

国内应用例子

国内最具影响力科技创投媒体36Kr的容器化之路


k8s 应用部署

k8s jenkins

mediawiki k8s

Docker 安装mediawiki

mediawiki k8s

k8s wordpress

部署 Wordpress 示例

k8s经典实战—搭建WordPress

K8S nginx volume之nfs挂载 没用pv pvc


#首先 nfs  88.122 

mkdir /data/k8s/ng && chmod -R 0777/data/k8s/ng

cat nfs_nginx.yaml 
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-nfs
  labels:
    web: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
       appname: nginx
  template:
    metadata:
      labels:
        appname: nginx
    spec:
      containers:
      - name: nginx-nfs
        image: nginx
        volumeMounts:
        - name: nfs-test
          mountPath: /usr/share/nginx/html/
      volumes:
      - name: nfs-test
        nfs:
          server: 192.168.88.122
          path: /data/k8s/ng



查看结果  

 root@k8s-master:~# kubectl exec  -it nginx-nfs-8465d697cc-584qd bash
 
 
 root@nginx-nfs-8465d697cc-584qd:/# cd /usr/share/nginx/html/
root@nginx-nfs-8465d697cc-584qd:/usr/share/nginx/html# ls
root@nginx-nfs-8465d697cc-584qd:/usr/share/nginx/html# touch 1.html 
echo '36'>1.html


回来 nfs  
 
 [root@work2 ~]# cat /data/k8s/ng/1.html 
36

问题 coredns 问题 导致 curl IP  没成功

Linux:K8S volume之nfs挂载

k8s mysql5.7 NFS 持久化

问题 这个有时会断开 不过好像昨天 删除了好多pod pv pvc 后 今天搞了就不会了呢 Aug 31 2021

好的在 K8s mysql NFS 持久化

K8S 部署 Mysql(NFS 持久化)

k8s使用nfs持久存储mysql数据的一次踩坑

    为什么mysql服务会不可用?为什么严重时整个k8s中的pod都处于pendding状态了呢?

写io是很耗cpu的,更何况这种大量复制。既然服务不可用了,我们使用top命令查看下k8s worker节点机器的各项性能,如下图。发现nfs在同步过程有一个nginx的command的进程cpu竟然达到了99%,us的cpu达到了23.5%,sy的cpu达到了48.6%,很显然,io同步时消耗了大量的cpu,导致mysql服务不可用了,而k8s的pod都会占用宿主机的cpu的资源的,如果宿主机的cpu资源不够pod所申明的cpu,pod将会重新构建,进而进入pod的生命周期中的pendding状态,所有pod都在争抢宿主机cpu的资源。

NFS 搭建

Debian(Ubuntu)安装nfs apt

Nfs实现日志集中查看 yum

 mkdir -p /data/k8s/mysql

#on centos7
yum -y install nfs-utils

root@work2 ~]# cat /etc/exports
/data/k8s/ 192.168.88.0/24(sync,rw,no_root_squash)



systemctl enable nfs
 systemctl restart nfs 

k8s nfs的一个问题

创建命名空间

kubectl create namespace db-mysql

mysql-nfs-pv.yaml


#k8s master 

cat > /root/mysqltest/mysql-nfs-pv.yaml  <<EOF
kind: PersistentVolume
apiVersion: v1
metadata:
  name: mysql-nfs-pv
  namespace: db-mysql
spec:
  accessModes:
    - ReadWriteOnce      
  capacity:
    storage: 2Gi
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs
  nfs:
    path: /data/k8s/mysql
    server: 192.168.88.22

EOF

kubectl apply -f mysql-nfs-pv.yaml


mysql-nfs-pvc.yaml

cat > /root/mysqltest/mysql-nfs-pvc.yaml <<EOF

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: mysql-nfs-pvc
  namespace: db-mysql
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
  storageClassName: nfs 

EOF


kubecte apply -f mysql-nfs-pvc.yaml


mysql-nfs-deploy.yaml


cat > /root/mysqltest/mysql-nfs-deploy.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-nfs-deploy
  namespace: db-mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql_nfs
  template:
    metadata:
      labels:
        app: mysql_nfs
    spec:
      containers:
      - name: mysql57
        image: mysql:5.7
        imagePullPolicy: IfNotPresent
        
        env:                        
        - name: MYSQL_ROOT_PASSWORD
          value: "123456"
        args:
        - --lower_case_table_names=1
        ports:
        - containerPort: 3306
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql         
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-nfs-pvc      
EOF

kubectl apply -f mysql-nfs-deploy.yam


mysql-nfs-svc.yaml

cat > /root/mysqltest/mysql-nfs-svc.yaml <<EOF
apiVersion: v1
kind: Service
metadata:
  name: mysql
  namespace: db-mysql
spec:
  type: NodePort
  ports:
  - port: 3306
    targetPort: 3306
    nodePort: 32306
  selector:
    app: mysql_nfs

EOF


查看相关



 kubectl get pods -A -o wide

root@k8s-master:~/mysqltest# kubectl get pods -A -o wide | grep mysql-nfs 
default       mysql-nfs-deploy-5f4fc57696-x49mw    1/1     Running             15 (5m27s ago)   84m     10.244.1.2      k8s-node1    <none>           <none>
root@k8s-master:~/mysqltest# 


查看mysql数据 on nfs master

证明 这个nfs没问题呀  

# ls /data/k8s/mysql/
auto.cnf    ca.pem           client-key.pem  ib_logfile0  ibtmp1  performance_schema  public_key.pem   server-key.pem
ca-key.pem  client-cert.pem  ibdata1         ib_logfile1  mysql   private_key.pem     server-cert.pem
[root@work2 ~]# 

login mysql and other

kubectl exec -it mysql-nfs-deploy-5f4fc57696-x49mw /bin/bash

直接容器里面  没密码 哈哈 
 mysql -u root -p
 
 
 ysql> create database evan;
 
  在nfs 服务器
  
  ls  /data/k8s/mysql/evan/
db.opt



kubectl logs


遇上 mysql有bug  
kubectl logs mysql-nfs-deploy-5f4fc57696-x49mw

 We intentionally generate a memory trap
 
 
 
 超级教程   k8s部署mysql数据持久化 
 https://www.cnblogs.com/pluto-charon/p/14411780.html

K8S 部署 Mysql(NFS 持久化)

innodb 表损坏,导致mysqld 重启

MySQL5.7 服务 crash 后无法启动

see also

k8s+mysql+pv+pvc+NFS实现mysql容器编排

VPS

digitalocean

用他的服务 10/mo
如果是自己建呢  有CPU要求呢 还是买他的吧  两台 10/mon 但是自由,试一下这个行不行先, 等于还多了两个vm,不过上次的helm 2还是不成功呢

在DigitalOcean玩Kubernetes(K8S)

https://www.digitalocean.com/docs/kubernetes/overview/

vultr

这个看起来贵一点 这个vps下次暂停一下 不要浪费一个月5刀呢

K8s on aliyun

othre

Kubernetes使用过程中遇到的一些问题与解决方法


从零开始搭建Kubernetes集群(六、在K8S上部署Redis 集群)

从零开始搭建Kubernetes集群(五、搭建K8S Ingress


从零开始搭建Kubernetes集群(四、搭建K8S Dashboard)


从零开始搭建Kubernetes集群(七、如何监控K8S集群日志)

在kubernetes中部署tomcat与mysql集群


全面提升,阿里云Docker/Kubernetes(K8S) 日志解决方案与选型对比

部署你的第一个ASP.NET Core应用到k8s集群


从零开始搭建Kubernetes集群(六、在K8S上部署Redis 集群)


Kubernetes(k8s)部署并测试nginx service


个推基于 Docker 和 Kubernetes 的微服务实践


《拥抱下一代容器化工具》视频及电子书发布

helm gogs


K8S集群搭建,并部署nginx实现跨网络访问

java tomcat

Kubernetes】部署Tomcat服务


k8s部署tomcat数据持久化


Docker实践 - 安装Docker并在容器里运行tomcat

trouble

使用kube-proxy让外部网络访问K8S service的ClusterIP


telnet master主机的NodePort服务不通的问题


kubernetes踩坑:nodePort拒绝访问的问题

通过NodePort向k8s集群外部暴露服务

K8s的内部Pod之间都不通,搞了快两天


使用kube-proxy让外部网络访问K8S service的ClusterIP

【kubernetes/k8s概念】kube-proxy启动参数