44、Kubernetes容器玩法全解析

Kubernetes容器玩法全解析

1. 容器端口转发与网络模型

在Kubernetes系统中,Pod是基本的计算单元。为了更有效地使用Pod,我们先来了解容器端口转发以及Kubernetes的四种网络模型。

1.1 准备工作

为了演示四种网络模型的工作原理,我们将运行两个nginx Web应用。Docker Hub上nginx的默认端口是80,我们将通过修改nginx配置文件和Dockerfile,把端口从80改为8800,创建一个新的nginx Docker镜像。具体步骤如下:
1. 创建一个简单的nginx配置文件 nginx.conf ,监听8800端口:

# cat nginx.conf
server {
    listen       8800;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/log/host.access.log  main;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
    #error_page  404              /404.html;
    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
  1. 修改默认的nginx Dockerfile,将暴露端口从80改为8800,并添加配置文件:
# cat Dockerfile
FROM debian:jessie
MAINTAINER NGINX Docker Maintainers "docker-maint@nginx.com"
RUN apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 
573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62
RUN echo "deb http://nginx.org/packages/mainline/debian/ jessie nginx" >> 
/etc/apt/sources.list
ENV NGINX_VERSION 1.9.9-1~jessie
RUN apt-get update && \
    apt-get install -y ca-certificates nginx=${NGINX_VERSION} && \
        rm -rf /var/lib/apt/lists/*
COPY nginx.conf /etc/nginx/conf.d/default.conf
# forward request and error logs to docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log
RUN ln -sf /dev/stderr /var/log/nginx/error.log
VOLUME ["/var/cache/nginx"]
EXPOSE 8800
CMD ["nginx", "-g", "daemon off;"]
  1. 使用Docker命令构建镜像:
# docker build -t $(YOUR_DOCKERHUB_ACCOUNT)/nginx_8800 .
  1. 推送镜像到Docker Hub仓库:
# docker push $(YOUR_DOCKERHUB_ACCOUNT)/nginx_8800

完成上述步骤后,你可以使用纯Docker命令运行容器:

docker run -d -p 8800:8800 msfuko/nginx_8800

使用 curl $IP:8800 ,你应该能看到nginx的欢迎页面。如果你在Linux上运行,可以使用 ifconfig 命令查找 $IP ;如果你通过Docker machine在其他平台上运行,可以使用 docker-machine ip 命令。

1.2 四种网络模型

Kubernetes有四种网络模型,下面详细介绍:
- 容器到容器通信 :在一个Pod中创建两个nginx容器,分别监听80和8800端口。

# cat nginxpod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginxpod
spec:
  containers:
    -
      name: nginx80
      image: nginx
      ports:
        -
          containerPort: 80
          hostPort: 80
    -
      name: nginx8800
      image: msfuko/nginx_8800
      ports:
        -
          containerPort: 8800
          hostPort: 8800

创建Pod:

# kubectl create -f nginxpod.yaml

使用 kubectl get pods nginxpod 查看Pod状态,使用 kubectl describe pod nginxpod 查看详细信息。登录到 kube-node1 ,使用 docker ps 列出容器,使用 jq 作为JSON解析器检查容器的网络设置:

# docker inspect 3b467d8772f0 | jq '.[]| {NetworkMode: .HostConfig.
NetworkMode, NetworkSettings: .NetworkSettings}'

可以发现两个容器的网络模式都设置为映射容器模式,共享网络接口,因此它们彼此视为localhost。

  • Pod到Pod通信 :每个Pod都有自己的IP地址,使得Pod之间的通信变得容易。使用flannel作为覆盖网络,为每个节点定义不同的网段,每个数据包被封装成UDP数据包,使每个Pod IP可路由。

  • Pod到服务通信 :由于Pod可能会意外停止,其IP地址可能会改变。当为Pod或复制控制器暴露端口时,我们创建一个Kubernetes服务作为代理或负载均衡器。具体步骤如下:
    1. 创建一个名为 my-first-nginx 的复制控制器:

# kubectl run my-first-nginx --image=nginx --replicas=2 --port=80
  1. 列出Pod,确保复制控制器创建了两个Pod:
# kubectl get pod
  1. 为Pod暴露端口80:
# kubectl expose rc my-first-nginx --port=80 
  1. 使用 kubectl describe service my-first-nginx 查看服务详细信息,服务类型为ClusterIP,虚拟IP为 192.168.235.209 ,将流量分发到两个端点 192.168.20.2:80 192.168.55.5:80
  2. kube-proxy 守护进程在每个节点上作为网络代理工作,创建相应的iptables规则:
# iptables -t nat -L | grep my-first-nginx

你可以在目标节点上访问 localhost:43321 或在集群内访问 $nodeIP:43321

  • 外部到内部通信 :可以使用外部负载均衡器(如GCE的ForwardingRules或AWS的ELB)或直接访问节点IP来设置外部到内部的通信。这里介绍直接访问节点IP的方法:
    1. 创建一个名为 my-second-nginx 的复制控制器,有两个副本:
# kubectl run my-second-nginx --image=nginx --replicas=2 --port=80
  1. 以LoadBalancer类型暴露服务端口80:
# kubectl expose rc my-second-nginx --port=80 --type=LoadBalancer
  1. 使用 kubectl describe service my-second-nginx 查看服务详细信息,服务有一个虚拟IP 192.168.156.93 和一个节点端口31150。
  2. 列出iptables规则,查看不同类型服务的差异:
# iptables -t nat -L | grep my-second-nginx

来自节点端口或ClusterIP的流量将通过负载均衡机制重定向到目标Pod。

2. 灵活使用容器:Job和Daemon Set

Pod是Kubernetes中最小的计算单元,通常由复制控制器管理并通过服务暴露。这里介绍两个新特性:Job和Daemon Set,它们可以使Pod的使用更加有效。

2.1 准备工作
  • Job类型的Pod :Kubernetes Job中的Pod在完成工作后会直接终止。
  • Daemon类型的Pod :Daemon类型的Pod会在每个节点上创建,作为系统守护进程长期运行。

需要注意的是,Daemon Set类型在默认API设置中是禁用的,需要启用才能进行测试。启用方法如下:
- 对于 init.d 服务脚本,在 hyperkube apiserver kube-apiserver 命令后添加标签 --runtime-config=extensions/v1beta1/daemonsets=true

# cat /etc/init.d/kubernetes-master
(heading lines ignored)
:
# Start daemon.
echo $"Starting apiserver: "
daemon $apiserver_prog \
--service-cluster-ip-range=${CLUSTER_IP_RANGE} \
--insecure-port=8080 \
--secure-port=6443 \
--basic-auth-file="/root/ba_file" \
--address=0.0.0.0 \
--etcd_servers=${ETCD_SERVERS} \
--cluster_name=${CLUSTER_NAME} \
--runtime-config=extensions/v1beta1/daemonsets=true \
> ${logfile}-apiserver.log 2>&1 &
:
(ignored)
  • 对于 systemd 服务管理,在配置文件中添加标签作为可选参数。
# cat /etc/kubernetes/apiserver
(heading lines ignored)
:
# Add your own!
KUBE_API_ARGS="--cluster_name=Happy-k8s-cluster --runtime-
config=extensions/v1beta1/daemonsets=true"

设置标签后,删除 /tmp/kubectl.schema 目录,然后重启Kubernetes apiserver:

# rm -f /tmp/kubectl.schema
# service kubernetes-master restart
# systemd restart kube-apiserver 

重启后,使用 curl http://localhost:8080/apis/extensions/v1beta1 检查Daemon Set是否已启用。

2.2 创建Job和Daemon Set

由于没有命令行界面来创建Job或Daemon Set,我们需要通过编写配置文件来构建这两种资源类型。
- Pod作为Job :Job类型的Pod适用于测试容器,如单元测试、集成测试或静态程序。以下是一个检查 ubuntu 镜像中安装包的Job模板:

# cat job-dpkg.yaml
apiVersion: extensions/v1beta1
kind: Job
metadata:
  name: package-check
spec:
  selector:
    matchLabels:
      image: ubuntu
      test: dpkg
  template:
    metadata:
      labels:
        image: ubuntu
        test: dpkg
        owner: Amy
    spec:
      containers:
      - name: package-check
        image: ubuntu
        command: ["dpkg-query", "-l"]
      restartPolicy: Never

创建Job:

# kubectl create -f job-dpkg.yaml

使用 kubectl get job kubectl get pod 验证Job和Pod的状态,使用 kubectl logs 获取结果,使用 kubectl describe job 查看详细信息。删除Job:

# kubectl stop job package-check

如果需要创建多个Pod来完成一个Job,可以添加 spec.completions 项指定Pod数量:

# cat job-dpkg.yaml
apiVersion: extensions/v1beta1
kind: Job
metadata:
  name: package-check
spec:
  completions: 3
  template:
    metadata:
      name: package-check-amy
      labels:
        image: ubuntu
        test: dpkg
        owner: Amy
    spec:
      containers:
      - name: package-check
        image: ubuntu
        command: ["dpkg-query", "-l"]
      restartPolicy: Never
  • Pod作为Daemon Set :如果创建了Kubernetes Daemon Set,定义的Pod将部署在每个节点上,确保每个节点上的运行容器占用相等的资源。以下是一个检查内存使用情况的Daemon Set模板:
# cat daemonset-free.yaml
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: ram-check
spec:
  selector:
    app: checkRam
    version: v1
  template:
    metadata:
      labels:
        app: checkRam
        owner: Amy
        version: v1
    spec:
      containers:
      - name: ubuntu-free
        image: ubuntu
        command: ["/bin/bash","-c","while true; do free; sleep 30; done"]
      restartPolicy: Always

创建Daemon Set:

# kubectl create -f daemonset-free.yaml

使用 kubectl get ds kubectl describe ds 查看Daemon Set的信息,使用 kubectl get pod kubectl describe pods 查看Pod的信息,使用 kubectl logs 获取结果。删除Daemon Set:

# kubectl stop -f daemonset-free.yaml
# kubectl stop ds ram-check

如果只需要在特定节点上运行Daemon Set,可以先给节点打标签,然后在模板中使用 spec.template.spec.nodeSelector 进行选择:

# kubectl label nodes kube-node3 runDS=ok
# cat daemonset-free.yaml
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: ram-check
spec:
  selector:
    app: checkRam
    version: v1
  template:
    metadata:
      labels:
        app: checkRam
        owner: Amy
        version: v1
    spec:
      nodeSelector:
        runDS: ok
      containers:
      - name: ubuntu-free
        image: ubuntu
        command: ["/bin/bash","-c","while true; do free; sleep 30; done"]
      restartPolicy: Always

总结

通过本文,我们学习了Kubernetes的容器端口转发和四种网络模型,以及如何使用Job和Daemon Set灵活管理Pod。这些知识可以帮助你更好地在Kubernetes中部署和管理容器化应用。

Kubernetes容器玩法全解析

3. 网络模型的深入理解与应用场景
3.1 网络模型对比分析

为了更清晰地理解Kubernetes的四种网络模型,我们可以通过以下表格进行对比:
| 网络模型 | 特点 | 应用场景 |
| — | — | — |
| 容器到容器通信 | 同一Pod内的容器共享网络接口,视为localhost,通信高效 | 适合紧密耦合的应用组件,如Web应用和其缓存服务 |
| Pod到Pod通信 | 每个Pod有独立IP,通过覆盖网络实现通信 | 不同功能模块的Pod之间通信,如前端和后端服务 |
| Pod到服务通信 | 服务作为代理或负载均衡器,处理Pod IP变化问题 | 确保服务的高可用性和负载均衡,如多个副本的Web服务 |
| 外部到内部通信 | 通过外部负载均衡器或节点IP实现外部访问 | 让外部用户能够访问Kubernetes集群内的服务,如Web应用对外提供服务 |

3.2 网络模型的工作流程

下面是一个mermaid格式的流程图,展示了Pod到服务通信的工作流程:

graph LR
    A[客户端请求] --> B(Kubernetes服务虚拟IP)
    B --> C(kube - proxy)
    C --> D{负载均衡}
    D --> E1(Pod1)
    D --> E2(Pod2)
    D --> E3(Pod3)

从流程图可以看出,客户端的请求首先到达Kubernetes服务的虚拟IP,然后由 kube - proxy 进行处理,通过负载均衡机制将流量分发到相应的Pod。

4. Job和Daemon Set的高级应用与注意事项
4.1 Job的高级应用
  • 定时任务 :结合Kubernetes的CronJob特性,可以实现定时执行Job。例如,每天凌晨执行数据备份任务。
# cat cronjob-backup.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: data - backup
spec:
  schedule: "0 0 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: backup - container
            image: backup - image
            command: ["backup - script"]
          restartPolicy: OnFailure

创建CronJob:

# kubectl create -f cronjob - backup.yaml
  • 任务依赖 :在某些情况下,Job之间可能存在依赖关系。可以通过编写脚本或使用第三方工具来实现任务的顺序执行。
4.2 Daemon Set的高级应用
  • 节点监控 :在每个节点上部署监控容器,实时收集节点的性能指标,如CPU、内存、磁盘使用情况等。
# cat daemonset - monitor.yaml
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: node - monitor
spec:
  selector:
    app: monitor
    version: v1
  template:
    metadata:
      labels:
        app: monitor
        owner: Admin
        version: v1
    spec:
      containers:
      - name: monitor - container
        image: monitor - image
        command: ["monitor - script"]
      restartPolicy: Always

创建Daemon Set:

# kubectl create -f daemonset - monitor.yaml
  • 日志收集 :在每个节点上部署日志收集容器,将节点上的日志统一收集并发送到日志存储系统。
4.3 注意事项
  • Job :Job的selector不能指向现有的Pod,避免将受复制控制器控制的Pod误用作Job。同时,Pod的重启策略应设置为 Never OnFailure
  • Daemon Set :在启用Daemon Set之前,务必按照前面介绍的方法正确配置API服务器。另外,在选择节点运行Daemon Set时,要确保节点标签的准确性。
5. 总结与实践建议
5.1 总结

Kubernetes的容器管理功能强大,通过四种网络模型和Job、Daemon Set等特性,可以实现灵活高效的容器部署和管理。网络模型确保了容器之间、Pod之间以及与外部的通信顺畅,而Job和Daemon Set则满足了不同类型任务的需求。

5.2 实践建议
  • 逐步实践 :初学者可以先从简单的网络模型和基本的Job、Daemon Set配置开始,逐步深入学习和实践。
  • 监控与优化 :在实际应用中,要对容器和服务进行监控,根据性能指标进行优化,确保系统的稳定性和高效性。
  • 参考官方文档 :Kubernetes官方文档提供了详细的技术说明和示例,是学习和实践的重要参考资料。

通过不断学习和实践,你将能够熟练掌握Kubernetes的容器管理技巧,为容器化应用的部署和运行提供有力支持。

内容概要:本文详细介绍了一种基于Simulink的表贴式永磁同步电机(SPMSM)有限控制集模型预测电流控制(FCS-MPCC)仿真系统。通过构建PMSM数学模型、坐标变换、MPC控制器、SVPWM调制等模块,实现了对电机定子电流的高精度跟踪控制,具备快速动态响应和低稳态误差的特点。文中提供了完整的仿真建模步骤、关键参数设置、核心MATLAB函数代码及仿真结果分析,涵盖转速、电流、转矩和三相电流波形,验证了MPC控制策略在动态性能、稳态精度和抗负载扰动方面的优越性,并提出了参数自整定、加权代价函数、模型预测转矩控制和弱磁扩速等优化方向。; 适合人群:自动化、电气工程及其相关专业本科生、研究生,以及从事电机控制算法研究与仿真的工程技术人员;具备一定的电机原理、自动控制理论和Simulink仿真基础者更佳; 使用场景及目标:①用于永磁同步电机模型预测控制的教学演示、课程设计或毕业设计项目;②作为电机先进控制算法(如MPC、MPTC)的仿真验证平台;③支撑科研中对控制性能优化(如动态响应、抗干扰能力)的研究需求; 阅读建议:建议读者结合Simulink环境动手搭建模型,深入理解各模块间的信号流向与控制逻辑,重点掌握预测模型构建、代价函数设计与开关状态选择机制,并可通过修改电机参数或控制策略进行拓展实验,以增强实践与创新能力。
根据原作 https://pan.quark.cn/s/23d6270309e5 的源码改编 湖北省黄石市2021年中考数学试卷所包含的知识点广泛涉及了中学数学的基础领域,涵盖了实数、科学记数法、分式方程、几何体的三视图、立体几何、概率统计以及代数方程等多个方面。 接下来将对每道试题所关联的知识点进行深入剖析:1. 实数与倒数的定义:该题目旨在检验学生对倒数概念的掌握程度,即一个数a的倒数表达为1/a,因此-7的倒数可表示为-1/7。 2. 科学记数法的运用:科学记数法是一种表示极大或极小数字的方法,其形式为a×10^n,其中1≤|a|<10,n为整数。 此题要求学生运用科学记数法表示一个天文单位的距离,将1.4960亿千米转换为1.4960×10^8千米。 3. 分式方程的求解方法:考察学生解决包含分母的方程的能力,题目要求找出满足方程3/(2x-1)=1的x值,需通过消除分母的方式转化为整式方程进行解答。 4. 三视图的辨认:该题目测试学生对于几何体三视图(主视图、左视图、俯视图)的认识,需要识别出具有两个相同视图而另一个不同的几何体。 5. 立体几何与表面积的计算:题目要求学生计算由直角三角形旋转形成的圆锥的表面积,要求学生对圆锥的底面积和侧面积公式有所了解并加以运用。 6. 统计学的基础概念:题目涉及众数、平均数、极差和中位数的定义,要求学生根据提供的数据信息选择恰当的统计量。 7. 方程的整数解求解:考察学生在实际问题中进行数学建模的能力,通过建立方程来计算在特定条件下帐篷的搭建方案数量。 8. 三角学的实际应用:题目通过在直角三角形中运用三角函数来求解特定线段的长度。 利用正弦定理求解AD的长度是解答该问题的关键。 9. 几何变换的应用:题目要求学生运用三角板的旋转来求解特定点的...
Python基于改进粒子群IPSO与LSTM的短期电力负荷预测研究内容概要:本文围绕“Python基于改进粒子群IPSO与LSTM的短期电力负荷预测研究”展开,提出了一种结合改进粒子群优化算法(IPSO)与长短期记忆网络(LSTM)的混合预测模型。通过IPSO算法优化LSTM网络的关键参数(如学习率、隐层节点数等),有效提升了模型在短期电力负荷预测中的精度与收敛速度。文中详细阐述了IPSO算法的改进策略(如引入自适应惯性权重、变异机制等),增强了局搜索能力与避免早熟收敛,并利用实际电力负荷数据进行实验验证,结果表明该IPSO-LSTM模型相较于传统LSTM、PSO-LSTM等方法在预测准确性(如MAE、RMSE指标)方面表现更优。研究为电力系统调度、能源管理提供了高精度的负荷预测技术支持。; 适合人群:具备一定Python编程基础、熟悉基本机器学习算法的高校研究生、科研人员及电力系统相关领域的技术人员,尤其适合从事负荷预测、智能优化算法应用研究的专业人士。; 使用场景及目标:①应用于短期电力负荷预测,提升电网调度的精确性与稳定性;②为优化算法(如粒子群算法)与深度学习模型(如LSTM)的融合应用提供实践案例;③可用于学术研究、毕业论文复现或电力企业智能化改造的技术参考。; 阅读建议:建议读者结合文中提到的IPSO与LSTM原理进行理论学习,重点关注参数优化机制的设计思路,并动手复现实验部分,通过对比不同模型的预测结果加深理解。同时可拓展尝试将该方法应用于其他时序预测场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值