云原生|kubernetes|静态pod和静态pod的应用

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 云原生|kubernetes|静态pod和静态pod的应用

前言:

在kubernetes集群中,pod依据它的运行方式分为静态pod和动态pod。

静态pod的定义如下:静态pod 是由 kubelet 管理的只在特定node上存在的pod;静态pod总是由kubelet创建的,并且只在kubelet所在的Node上运行。

以上概念说的还是比较抽象,难以理解。说人话就是,静态pod这一类型的pod是由kubelet负责管理的,而kubelet是kubernetes集群的核心组件,此组件可运行在master上也可以运行在工作节点上,一个节点有一个kubelet实例,那么,如果部署的pod类型是静态的,此pod是不需要设置任何亲和的。

常见的静态pod通常是kubeadm部署的kube-controller-manager kube-scheduler kube-apiserver 这些pod,例如minikube部署的集群2 3 4  7都是静态pod:

[root@node3 kubernetes]# kubectl get po -n kube-system -owide
NAME                            READY   STATUS    RESTARTS   AGE    IP               NODE    NOMINATED NODE   READINESS GATES
coredns-7ff77c879f-nsj95        1/1     Running   6          3d2h   10.244.0.18      node3   <none>           <none>
etcd-node3                      1/1     Running   6          3d2h   192.168.217.23   node3   <none>           <none>
kube-apiserver-node3            1/1     Running   6          3d2h   192.168.217.23   node3   <none>           <none>
kube-controller-manager-node3   1/1     Running   6          3d2h   192.168.217.23   node3   <none>           <none>
kube-flannel-ds-amd64-6cdl5     1/1     Running   7          3d2h   192.168.217.23   node3   <none>           <none>
kube-proxy-vdhzr                1/1     Running   6          3d2h   192.168.217.23   node3   <none>           <none>
kube-scheduler-node3            1/1     Running   6          3d2h   192.168.217.23   node3   <none>           <none>
storage-provisioner             1/1     Running   10         3d2h   192.168.217.23   node3   <none>           <none>

以上静态pod我们可以观察出一个特点:命名为服务名+主机名,网络模式通常设定的都是hostnetwork,而这样的pod就像是一个稳定的服务,和StateFulSet是比较像的。

那么,下面将仿照这些构成核心组件的静态pod,部署一个像在本地运行的MySQL服务。

一,

静态pod的文件管理设定

静态pod的部署清单文件存放位置为kubelet设定的启动参数--pod-manifest-path此参数的值,而二进制部署的通常是没有设定此参数的,下面以minikube为例,它的静态pod存放路径为/etc/kubernetes/manifests:

[root@node3 manifests]# systemctl status kubelet -l
● kubelet.service - kubelet: The Kubernetes Node Agent
   Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/kubelet.service.d
           └─10-kubeadm.conf
   Active: active (running) since Sun 2022-11-06 16:43:38 CST; 3h 18min ago
     Docs: http://kubernetes.io/docs/
 Main PID: 1104 (kubelet)
   Memory: 80.0M
   CGroup: /system.slice/kubelet.service
           └─1104 /var/lib/minikube/binaries/v1.18.8/kubelet --authorization-mode=Webhook --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --cgroup-driver=systemd --client-ca-file=/var/lib/minikube/certs/ca.crt --config=/var/lib/kubelet/config.yaml --container-runtime=docker --hostname-override=node3 --kubeconfig=/etc/kubernetes/kubelet.conf --network-plugin=cni --node-ip=192.168.217.23 --pod-cidr=10.244.0.0/16 --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.2 --pod-manifest-path=/etc/kubernetes/manifests

那么,如果不想使用这个默认目录,自己定义的话,可以更改此文件的静态pod部署清单存放路径:

[root@node3 manifests]# cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 
[Unit]
Wants=docker.socket
[Service]
ExecStart=
ExecStart=/var/lib/minikube/binaries/v1.18.8/kubelet --authorization-mode=Webhook --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --cgroup-driver=systemd --client-ca-file=/var/lib/minikube/certs/ca.crt --config=/var/lib/kubelet/config.yaml --container-runtime=docker --hostname-override=node3 --kubeconfig=/etc/kubernetes/kubelet.conf --network-plugin=cni --node-ip=192.168.217.23 --pod-cidr=10.244.0.0/16 --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.2 --pod-manifest-path=/etc/kubernetes/manifests

二进制部署的集群,静态pod的资源清单文件存放路径:

[root@k8s-master ~]# systemctl status kubelet -l
● kubelet.service - Kubernetes Kubelet
   Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2022-11-06 20:06:21 CST; 2min 59s ago
 Main PID: 1303 (kubelet)
   Memory: 187.9M
   CGroup: /system.slice/kubelet.service
           ├─1303 /opt/kubernetes/bin/kubelet --logtostderr=false --v=2 --log-dir=/opt/kubernetes/logs --hostname-override=k8s-master --network-plugin=cni --kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig --bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig --config=/opt/kubernetes/cfg/kubelet-config.yml --cert-dir=/opt/kubernetes/ssl --pod-manifest-path=/opt/staticpod/ --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2
           ├─3692 /opt/cni/bin/calico
           └─3821 /opt/cni/bin/calico
[root@k8s-master cfg]# cat kubelet.conf 
KUBELET_OPTS="--logtostderr=false \
--v=2 \
--log-dir=/opt/kubernetes/logs \
--hostname-override=k8s-master \
--network-plugin=cni \
--kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig \
--bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig \
--config=/opt/kubernetes/cfg/kubelet-config.yml \
--cert-dir=/opt/kubernetes/ssl \
--pod-manifest-path=/opt/staticpod/ \
--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2"

根据部署手法不同,此二进制部署的kubelet的配置文件定义在/usr/lib/systemd/system/kubelet.service里指定的kubelet.conf 文件,在此配置文件添加--pod-manifest-path这个启动参数即可。参数设定后,重启kubelet服务即可,此时的--pod-manifest-path指定的路径里放置要部署的静态pod的文件,kubelet即可自动检测文件是否可执行,并进行部署。这里多说一句,此路径非常像linux系统的/etc/init.d/目录,在这个目录下的所有可执行的shell脚本都会开机启动运行,同样的,在上例 的  /opt/staticpod 这个目录下的所有pod类型的可以正常部署的文件都会由kubelet进行部署。

二,

静态pod的局限性

上面一节讲了存放pod部署文件的路径问题,那么,此路径下是否可以放置任何需要部署的文件内?答案是否定的,不可以,kubelet只能部署kind类型是pod的pod,因此,deployment,statesetful,rc,rs等等所有带有控制器的类型都不可以,如果你非要把这个文件扔进去,那也无所谓,只是kubelet会不停的报警而已。

其次就是安全方面的问题了,如果有不怀好意的人造访了你的服务器,并且将一个恶意的pod部署文件放到上述的路径下了,那么,将会有非常不好的事情发生,或者不怀好意的人进入了你的静态pod文件存放路径,并且非常不巧的是kubeadm部署的集群,那么,所有的核心组件都可能被修改,其危害程度应该是和SQL注入一样的,甚至更危险。因此,对于静态pod的保护需要更多的手段和方法。

静态pod的优势:

简单方便快捷,只要目录内符合条件的部署文件都会自动部署,对此文件的任何修改也会立刻反应到pod中,非常适合那些需要稳定的服务,比如,MySQL数据库,当然,部署文件编写不需要任何的亲和反亲和等等规则,你放置到哪个节点的kubelet的静态pod目录下,它就会在当前节点生成了嘛。

三,

部署静态的MySQL示例

部署一个可在集群外访问的MySQL数据库

这种部署方式由于使用了hostNetwork模式,因此,不需要特别部署service,其中使用了存活探针--持续监测容器的3311端口,此端口是下面的配置文件定义。

使用了hostpath挂载的方式挂载容器的数据库到宿主机的 /opt/mysql/data目录下,配置文件存放路径为 /opt/mysql/conf  。

设置了priorityClassName: system-cluster-critical 最高的调度优先级,防止此pod被其它pod抢占(配合此设置,部署到了kube-system命名空间内)。

设置了MySQL的root密码为123456

将此文件放入静态pod存放路径,即可自动部署,以minikube为例,存放到/etc/kubernetes/manifests目录下即可。

cat > static-mysq.yaml <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: mysql
  labels:
    run: mysql
  name: mysql
  namespace: kube-system
spec:
  containers:
  - env:
    - name: MYSQL_ROOT_PASSWORD
      value: 123456
    image: mysql:5.7.39
    imagePullPolicy: IfNotPresent
    livenessProbe:
      tcpSocket:
         port: 3311
      initialDelaySeconds: 15
      periodSeconds: 5
      failureThreshold: 8
    resources:
      requests:
        cpu: 200m
    name: mysql
    volumeMounts:
    - mountPath: /var/lib/mysql
      name: mysql-data
      readOnly: false
    - mountPath: /etc/mysql/mysql.conf.d
      name: mysql-conf
      readOnly: false
  dnsPolicy: ClusterFirst
  restartPolicy: Always
  volumes:
  - name: mysql-data
    hostPath:
      path: /opt/mysql/data
      type: DirectoryOrCreate
  - name: mysql-conf
    hostPath:
      path: /opt/mysql/conf
      type: DirectoryOrCreate
  hostNetwork: true
  priorityClassName: system-cluster-critical
status: {}
EOF

在启动pod的时候,写入配置文件:

这个配置文件设定了MySQL的服务端口是3311,此端口也是pod的存活探针端口。

设定了慢查询以及binlog日志

 cat >/opt/mysql/conf/mysqld.cnf <<EOF
[client]
default-character-set = utf8mb4
port = 3311
socket = /var/lib/mysql/mysql.sock
[mysql]
no_auto_rehash
show-warnings
default-character-set = utf8mb4
socket = /var/lib/mysql/mysql.sock
[mysqld]
user = mysql
port = 3311
symbolic-links = 0
server_id = 56102
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
character-set-server = utf8mb4
skip_name_resolve = 1
lock_wait_timeout = 3600
open_files_limit    = 65535
back_log = 1024
max_connections = 512
max_connect_errors = 1000000
table_open_cache = 1024
table_definition_cache = 1024
thread_stack = 512K
sort_buffer_size = 4M
join_buffer_size = 4M
read_buffer_size = 8M
read_rnd_buffer_size = 4M
bulk_insert_buffer_size = 64M
thread_cache_size = 768
interactive_timeout = 600
wait_timeout = 600
tmp_table_size = 32M
max_heap_table_size = 32M
log_error = /var/lib/mysql/error.log
log_error_verbosity = 3
slow_query_log = 1
slow_query_log_file = /var/lib/mysql/slow.log
long_query_time = 0.1
log_queries_not_using_indexes = 1
log_throttle_queries_not_using_indexes = 60
min_examined_row_limit = 100
log_slow_admin_statements = 1
log_slow_slave_statements = 1
log_bin = /var/lib/mysql/mysql_binlog
binlog_format = ROW
sync_binlog = 1
binlog_cache_size = 4M
max_binlog_cache_size = 2G     
max_binlog_size = 1G
binlog_rows_query_log_events = 1
binlog_checksum = CRC32
gtid_mode = ON
enforce_gtid_consistency = TRUE
key_buffer_size = 32M
myisam_sort_buffer_size = 128M
transaction_isolation = REPEATABLE-READ
innodb_buffer_pool_size = 500M
innodb_buffer_pool_instances = 4
innodb_data_file_path = ibdata1:12M:autoextend
innodb_flush_log_at_trx_commit = 1
innodb_log_buffer_size = 32M
innodb_log_file_size = 200M
innodb_log_files_in_group = 3
innodb_max_undo_log_size = 1G
innodb_io_capacity = 400
innodb_io_capacity_max = 800
innodb_open_files = 65535
innodb_flush_method = O_DIRECT
innodb_lru_scan_depth = 4000
innodb_lock_wait_timeout = 10
innodb_rollback_on_timeout = 1
innodb_print_all_deadlocks = 1
innodb_online_alter_log_max_size = 4G
innodb_status_file = 1
innodb_status_output = 0
innodb_status_output_locks = 1
innodb_sort_buffer_size = 67108864
innodb_adaptive_hash_index = OFF
[mysqldump]
quick
EOF

 

Navicat连接MySQL的测试:

可以看到静态pod已经正常运行:

[root@node3 manifests]# kubectl get po -A
NAMESPACE     NAME                            READY   STATUS    RESTARTS   AGE
default       static-web-node3                1/1     Running   6          3d3h
kube-system   coredns-7ff77c879f-nsj95        1/1     Running   6          3d4h
kube-system   etcd-node3                      1/1     Running   6          3d4h
kube-system   kube-apiserver-node3            1/1     Running   6          3d4h
kube-system   kube-controller-manager-node3   1/1     Running   6          3d4h
kube-system   kube-flannel-ds-amd64-6cdl5     1/1     Running   7          3d4h
kube-system   kube-proxy-vdhzr                1/1     Running   6          3d4h
kube-system   kube-scheduler-node3            1/1     Running   6          3d4h
kube-system   mysql-node3                     1/1     Running   0          10m

总结:

静态pod是一个双刃剑的事情,因此需要注意安全,防止类似SQL注入的事情发生,在平常巡检工作中可能还是需要对静态pod的目录予以关注,以上的MySQL数据库部署其实也给我们提供了一个方向:可以利用静态pod组织一个比较稳定可靠的集群,这样的集群部署会比其它方式更简单快速。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
3月前
|
消息中间件 人工智能 安全
云原生进化论:加速构建 AI 应用
本文将和大家分享过去一年在支持企业构建 AI 应用过程的一些实践和思考。
688 45
|
4月前
|
存储 弹性计算 Cloud Native
云原生数据库的演进与应用实践
随着企业业务扩展,传统数据库难以应对高并发与弹性需求。云原生数据库应运而生,具备计算存储分离、弹性伸缩、高可用等核心特性,广泛应用于电商、金融、物联网等场景。阿里云PolarDB、Lindorm等产品已形成完善生态,助力企业高效处理数据。未来,AI驱动、Serverless与多云兼容将推动其进一步发展。
225 8
|
10月前
|
Kubernetes Docker 容器
Kubernetes与Docker参数对照:理解Pod中的command、args与Dockerfile中的CMD、ENTRYPOINT。
需要明确的是,理解这些都需要对Docker和Kubernetes有一定深度的理解,才能把握二者的区别和联系。虽然它们都是容器技术的二个重要组成部分,但各有其特性和适用场景,理解它们的本质和工作方式,才能更好的使用这些工具,将各自的优点整合到生产环境中,实现软件的快速开发和部署。
384 25
|
9月前
|
Cloud Native Serverless 流计算
云原生时代的应用架构演进:从微服务到 Serverless 的阿里云实践
云原生技术正重塑企业数字化转型路径。阿里云作为亚太领先云服务商,提供完整云原生产品矩阵:容器服务ACK优化启动速度与镜像分发效率;MSE微服务引擎保障高可用性;ASM服务网格降低资源消耗;函数计算FC突破冷启动瓶颈;SAE重新定义PaaS边界;PolarDB数据库实现存储计算分离;DataWorks简化数据湖构建;Flink实时计算助力风控系统。这些技术已在多行业落地,推动效率提升与商业模式创新,助力企业在数字化浪潮中占据先机。
489 12
|
10月前
|
Kubernetes Shell Windows
【Azure K8S | AKS】在AKS的节点中抓取目标POD的网络包方法分享
在AKS中遇到复杂网络问题时,可通过以下步骤进入特定POD抓取网络包进行分析:1. 使用`kubectl get pods`确认Pod所在Node;2. 通过`kubectl node-shell`登录Node;3. 使用`crictl ps`找到Pod的Container ID;4. 获取PID并使用`nsenter`进入Pod的网络空间;5. 在`/var/tmp`目录下使用`tcpdump`抓包。完成后按Ctrl+C停止抓包。
360 12
|
11月前
|
Kubernetes 持续交付 开发工具
阿里云协同万兴科技落地ACK One GitOps方案,全球多机房应用自动化发布,效率提升50%
阿里云协同万兴科技落地ACK One GitOps方案,全球多机房应用自动化发布,效率提升50%
424 2
|
10月前
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
300 0
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
|
11月前
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
227 1
|
存储 Cloud Native 数据处理
从嵌入式状态管理到云原生架构:Apache Flink 的演进与下一代增量计算范式
本文整理自阿里云资深技术专家、Apache Flink PMC 成员梅源在 Flink Forward Asia 新加坡 2025上的分享,深入解析 Flink 状态管理系统的发展历程,从核心设计到 Flink 2.0 存算分离架构,并展望未来基于流批一体的通用增量计算方向。
379 0
从嵌入式状态管理到云原生架构:Apache Flink 的演进与下一代增量计算范式
|
5月前
|
运维 监控 Cloud Native
从本土到全球,云原生架构护航灵犀互娱游戏出海
本文内容整理自「 2025 中企出海大会·游戏与互娱出海分论坛」,灵犀互娱基础架构负责人朱晓靖的演讲内容,从技术层面分享云原生架构护航灵犀互娱游戏出海经验。
506 16

推荐镜像

更多