Kubernetes-3

Kubernetes学习第3天

  • Kubernetes-3
    • 1、查看实时的cpu和内存消耗
      • 1.1、kubectl top node
    • 2、卷的使用
      • 2.1、什么是卷?
        • 1. 解决数据持久性问题
        • 2. Kubernetes 中的卷抽象概念
        • 3. 共享数据示例
        • 4. Kubernetes 中的卷使用
        • 5. 不同类型的卷
        • 6. 灵活、可靠的数据管理
      • 2.2、联想到docker中的卷
      • 2.3、实践一下
    • 3、一个pod里启多个容器--容器类型
      • 3.1、写个简单的yaml文件
      • 3.2、运行yaml文件
      • 3.3、可不可以在yaml中同时创建pod和命名空间
      • 3.4、进入pod中的容器
      • 3.5、多个软件配合互相共享资源-sidecar
      • 3.6、利用边车模式去写个yaml,对日志的记录
      • 3.7、进一步做边车实验
    • 4、容器类型
      • 4.1、sidecar
      • 4.2、pause容器
      • 4.3、init 初始化容器(Init Container)
      • 4.4、app容器
    • 5、服务发现
    • 6、小练习

Kubernetes-3

1、查看实时的cpu和内存消耗

1.1、kubectl top node

首先要装个软件:metrics-server----》可获取pod的cpu,内存使用情况

  1. 在外界下载下:metrics-server的yaml文件,然后上传到虚拟机,进行解压

    [root@master pod]# unzip metrics-server.zip 
    [root@master pod]# 
    
  2. 进入metrics-server文件夹,把tar包传递给node节点

    [root@master metrics-server]# lscomponents.yaml  metrics-server-v0.6.3.tar
    [root@master metrics-server]# scp metrics-server-v0.6.3.tar node-1:/root
    metrics-server-v0.6.3.tar                             100%   67MB 150.8MB/s   00:00    
    [root@master metrics-server]# scp metrics-server-v0.6.3.tar node-2:/root
    metrics-server-v0.6.3.tar                             100%   67MB 151.7MB/s   00:00    
    [root@master metrics-server]# 
    
  3. 三台导入镜像

    [root@node-1 ~]# docker load -i metrics-server-v0.6.3.tar 
    
  4. 启用metrics-server pod

    [root@master metrics-server]# kubectl apply -f components.yaml 
    serviceaccount/metrics-server created
    clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
    clusterrole.rbac.authorization.k8s.io/system:metrics-server created
    rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
    clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
    clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
    service/metrics-server created
    deployment.apps/metrics-server created
    apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
    [root@master metrics-server]# 
    
    [root@master metrics-server]# kubectl get pod -n kube-system|grep metrics
    metrics-server-769f6c8464-ctxl7            1/1     Running   0          49s
    [root@master metrics-server]# 
    
  5. 查看是否可用

    [root@master metrics-server]# kubectl top node
    NAME     CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
    master   118m         5%     1180Mi          68%       
    node-1   128m         6%     985Mi           57%       
    node-2   60m          3%     634Mi           36%       
    [root@master metrics-server]# 
    
    [root@master metrics-server]# kubectl top pod nginx 
    NAME    CPU(cores)   MEMORY(bytes)   
    nginx   0m           2Mi             
    [root@master metrics-server]# 
    
    [root@master metrics-server]# kubectl top pod -n mem-example
    NAME            CPU(cores)   MEMORY(bytes)   
    memory-demo     30m          150Mi           
    memory-demo-3   32m          150Mi           
    [root@master metrics-server]# 
    

2、卷的使用

2.1、什么是卷?

当我们在容器中运行应用程序时,容器内的文件系统是临时的,容器停止后,其中的数据通常会丢失。卷(Volume)就是为了解决这一问题而设计的。卷提供了一种在容器之间共享保持数据的方法。

1. 解决数据持久性问题
  • 容器内文件系统是临时的,容器停止后数据丢失。
  • 卷提供持久存储,使数据在容器停止或重新启动时得以保留。
2. Kubernetes 中的卷抽象概念
  • 卷是对存储的一种抽象,可以连接到容器中。
  • 可将卷视为持久的存储空间,可被一个或多个容器访问。
3. 共享数据示例
  • 假设有一个运行在容器中的数据库应用。
  • 应用需要在容器停止后保留数据,以确保容器重新启动时能够继续工作。
4. Kubernetes 中的卷使用
  • 卷可以挂载到一个或多个容器中,实现数据共享。
  • 示例中,卷存储着配置文件,多个容器可以访问并共享这些文件。
  • 即使一个容器修改了文件,其他容器也能看到这些变化。
5. 不同类型的卷
  • 临时卷(Temporary Volumes)适合存储容器生命周期内的数据。
  • 持久卷(Persistent Volumes)适合在容器之间共享和保持数据。
6. 灵活、可靠的数据管理
  • 卷提供了灵活、可靠的方式,容器之间能够方便地共享和持久化数据。
  • 在构建复杂的应用系统中,卷是一个重要的工具。

2.2、联想到docker中的卷

docker 中的卷存放在 /var/lib/docker/volumes/

卷—>实现数据持久化

2.3、实践一下

https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-volume-storage/

  1. 在master上新建文件夹写yaml文件

    [root@master ~]# mkdir /volume
    [root@master ~]# cd /volume/
    [root@master volume]# vim redis.yaml
    apiVersion: v1
    kind: Pod
    metadata:name: redis
    spec:containers:- name: redisimage: redisvolumeMounts:- name: redis-storagemountPath: /data/redisvolumes:- name: redis-storageemptyDir: {}
    [root@master volume]# 
    

    这是一个使用 Redis 镜像创建的 Pod 配置文件。让我来解释一下其中的内容:

    • apiVersion: v1:指定了 Kubernetes API 的版本。
    • kind: Pod:定义了这个配置文件描述的对象是一个 Pod。
    • metadata:包含了关于 Pod 的元数据,比如名称等。
      • name: redis:指定了 Pod 的名称为 “redis”。
    • spec:定义了 Pod 的规格,包括容器和卷的配置。
      • containers:定义了 Pod 中的容器列表。
        • name: redis:指定了容器的名称为 “redis”。
        • image: redis:指定了容器使用的镜像为 Redis。
        • volumeMounts:定义了容器挂载的卷。
          • name: redis-storage:指定了卷的名称为 “redis-storage”,与下方的卷配置中的名称对应。
          • mountPath: /data/redis:指定了卷在容器中的挂载路径为 “/data/redis”。
      • volumes:定义了 Pod 中的卷列表。
        • name: redis-storage:指定了卷的名称为 “redis-storage”,与上方的容器挂载中的名称对应。
        • emptyDir: {}:指定了一个空目录卷,表示该卷是一个临时的、空的存储空间。

    这个配置文件描述了一个包含一个 Redis 容器的 Pod,并且为该容器提供了一个临时的空目录卷,用于存储 Redis 数据。

  2. 执行yaml文件

    [root@master volume]# kubectl apply -f redis.yaml 
    pod/redis created
    [root@master volume]# kubectl get pod
    NAME    READY   STATUS              RESTARTS   AGE
    nginx   1/1     Running             3          37h
    redis   0/1     ContainerCreating   0          6s
    [root@master volume]# kubectl get pod -o wide|grep redis
    redis   1/1     Running   0          61s   10.244.247.17   node-2   <none>           <none>
    [root@master volume]# 
    
  3. 查看redis pod的详细信息

    [root@master volume]# kubectl describe pod redis
    Volumes:redis-storage:Type:       EmptyDir (a temporary directory that shares a pod's lifetime)Medium:     SizeLimit:  <unset>default-token-zdvg8:Type:        Secret (a volume populated by a Secret)SecretName:  default-token-zdvg8Optional:    false
    QoS Class:       Burstable
    '并没有指定宿主机上零时卷的路径在哪里'
    '但是按照常理来说是在对应node节点上的/var/lib/kubelet/pods下边'
    [root@node-2 ~]# cd /var/lib/kubelet/pods
    您在 /var/spool/mail/root 中有新邮件
    [root@node-2 pods]# ls
    0a95481c-c0f8-400d-8c19-0780c9c3950a  6d5da3b8-a8cc-4574-b349-cb66a434000d
    185a4899-96d4-4244-808b-d8dc91f01136  b6e26401-0091-4128-a6b4-6abd541d42c5
    237dbbfc-d7ef-4758-ad56-285225b3b9f9  f727c33a-f4d3-4420-b4cb-f043d01dd85f
    [root@node-2 pods]# 
    
  4. 进入redis容器查看(在master上就可以进入),卷的位置

    [root@master volume]# kubectl exec redis -it -- bash
    root@redis:/data# pwd
    /data
    root@redis:/data# ls
    redis
    root@redis:/data# 
    
  5. 在redis目录下添加一个文件夹,去node-2中查看是否存在

    root@redis:/data# cd redis/
    root@redis:/data/redis# mkdir gaohui
    root@redis:/data/redis# ls
    gaohui
    root@redis:/data/redis# 
    
    [root@node-2 pods]# pwd
    /var/lib/kubelet/pods
    [root@node-2 pods]# find / -name gaohui
    /var/lib/kubelet/pods/185a4899-96d4-4244-808b-d8dc91f01136/volumes/kubernetes.io~empty-dir/redis-storage/gaohui
    [root@node-2 pods]# 
    

    卷会在node节点上创建

3、一个pod里启多个容器–容器类型

3.1、写个简单的yaml文件

[root@master volume]# cd /pod
[root@master pod]# mkdir pod2
[root@master pod]# cd pod2/
[root@master pod2]# 
[root@master pod2]# vim simple-pod.yaml
apiVersion: v1
kind: Pod
metadata:name: sc-nginxnamespace: sc 
spec:nodeName: node-2containers:- name: sc-nginximage: nginx:latestimagePullPolicy: IfNotPresentports:- containerPort: 80- name: sc-redisimage: redis:latestimagePullPolicy: IfNotPresentports:- containerPort: 6379[root@master pod2]# 

解释 YAML 文件:

  1. apiVersion: v1: 指定 Kubernetes API 版本为 v1。

  2. kind: Pod: 定义这个 YAML 文件描述的是一个 Pod 对象。

  3. metadata: 包含有关 Pod 的元信息。

    • name: sc-nginx: 指定 Pod 的名称为 “sc-nginx”。
    • namespace: sc: 将 Pod 放置在名为 “sc” 的命名空间中。
  4. spec: 定义了 Pod 的规格,包括容器、镜像、端口等配置。

    • containers: 定义了 Pod 中的容器列表。

      • 第一个容器:
        • name: sc-nginx: 容器的名称是 “sc-nginx”。
        • image: nginx:latest: 使用的容器镜像是最新版本的 Nginx。
        • imagePullPolicy: IfNotPresent: 如果本地不存在该镜像,则从远程仓库拉取。
        • ports: 容器监听的端口配置,这里是 80 端口。
      • 第二个容器:
        • name: sc-redis: 容器的名称是 “sc-redis”。
        • image: redis:latest: 使用的容器镜像是最新版本的 Redis。
        • imagePullPolicy: IfNotPresent: 如果本地不存在该镜像,则从远程仓库拉取。
        • ports: 容器监听的端口配置,这里是 6379 端口。
    • nodeName: node-2: 指定 Pod 被调度到名为 “node-2” 的节点上。

这份 YAML 文件描述了一个包含两个容器的 Pod,一个运行 Nginx,另一个运行 Redis。这个 Pod 被放置在 “sc” 命名空间中,且指定了调度到 “node-2” 节点上。

3.2、运行yaml文件

切记一定要创建命名空间,不然会报错

[root@master pod2]# kubectl create namespace sc 
namespace/sc created
[root@master pod2]# kubectl apply -f simple-pod.yaml 
pod/sc-nginx created
[root@master pod2]# kubectl get pod -n sc -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP              NODE     NOMINATED NODE   READINESS GATES
sc-nginx   2/2     Running   0          10s   10.244.247.19   node-2   <none>           <none>
[root@master pod2]# 
[root@master pod2]# kubectl top pod sc-nginx -n sc
NAME       CPU(cores)   MEMORY(bytes)   
sc-nginx   1m           3Mi             
[root@master pod2]# 

3.3、可不可以在yaml中同时创建pod和命名空间

apiVersion: v1
kind: Namespace
metadata:name: sc---
apiVersion: v1
kind: Pod
metadata:name: sc-nginxnamespace: sc 
spec:nodeName: node-2containers:- name: sc-nginximage: nginx:latestimagePullPolicy: IfNotPresentports:- containerPort: 80- name: sc-redisimage: redis:latestimagePullPolicy: IfNotPresentports:- containerPort: 6379
[root@master pod2]# kubectl apply -f simple-pod.yaml 
namespace/sc2 created
pod/sc-nginx-redis created
[root@master pod2]# kubectl get pod -n sc2
NAME             READY   STATUS    RESTARTS   AGE
sc-nginx-redis   2/2     Running   0          12s
[root@master pod2]# 

3.4、进入pod中的容器

[root@master pod2]# kubectl exec -n sc2 sc-nginx-redis -c sc-nginx -it -- /bin/bash
root@sc-nginx-redis:/# ls
bin   docker-entrypoint.d   home   media  proc	sbin  tmp
boot  docker-entrypoint.sh  lib    mnt	  root	srv   usr
dev   etc		    lib64  opt	  run	sys   var
root@sc-nginx-redis:/# cd /usr/share/nginx/
root@sc-nginx-redis:/usr/share/nginx# ls
html
root@sc-nginx-redis:/usr/share/nginx# cd html/
root@sc-nginx-redis:/usr/share/nginx/html# ls
50x.html  index.html

3.5、多个软件配合互相共享资源-sidecar

sidecar:边车

在容器化的应用程序中,有时候我们希望多个容器能够共享资源或协同工作。为了实现这样的需求,可以使用一种设计模式称为Sidecar

Sidecar 是一种附加到主要容器旁边的辅助容器。主要容器是应用程序的核心组件,而 Sidecar 则提供了额外的功能和服务。Sidecar 容器与主要容器运行在同一个 Pod 中,它们共享相同的网络和存储空间,可以通过本地主机通信。

Sidecar 容器可以提供各种不同的功能,例如:

  1. 日志收集:Sidecar 容器可以负责收集主要容器的日志,并将其发送到中央日志系统,以便进行集中管理和分析。
  2. 监控和指标收集:Sidecar 容器可以收集主要容器的监控数据和指标,并将其发送到监控系统,以便进行实时监控和分析。
  3. 安全代理:Sidecar 容器可以作为安全代理,处理主要容器的网络流量加密、认证和授权等安全功能。
  4. 数据同步:Sidecar 容器可以负责将主要容器产生的数据同步到外部存储系统,或者从外部存储系统读取数据并同步到主要容器。
  5. 缓存代理:Sidecar 容器可以作为缓存代理,提供缓存服务,加速主要容器的访问速度。
  6. 动态配置:Sidecar 容器可以负责动态更新主要容器的配置,以适应不同的环境和需求。

通过将这些功能模块化为 Sidecar 容器,我们可以实现更好的代码隔离、模块化和可维护性。同时,由于 Sidecar 容器与主要容器运行在同一个 Pod 中,它们之间可以通过本地主机通信,减少了网络开销和延迟。

总而言之,Sidecar 是一种在容器化应用程序中实现多个容器共享资源和协同工作的设计模式,可以提供额外的功能和服务,以提高应用程序的可扩展性、可靠性和安全性。

3.6、利用边车模式去写个yaml,对日志的记录

[root@master pod]# mkdir log
[root@master pod]# cd log/
[root@master log]# vim two-file-counter-pod.yaml
apiVersion: v1
kind: Pod
metadata:name: counter
spec:containers:- name: countimage: busybox:1.28args:- /bin/sh- -c- >i=0;while true;doecho "$i: $(date)" >> /var/log/1.log;echo "$(date) INFO $i" >> /var/log/2.log;i=$((i+1));sleep 1;done      volumeMounts:- name: varlogmountPath: /var/logvolumes:- name: varlogemptyDir: {}
[root@master log]# 

这是一个 Kubernetes Pod 的 YAML 文件,用于创建一个包含两个容器的 Pod,每个容器都在不断地向文件写入计数和时间信息。以下是对 YAML 文件的解释:

  • apiVersion: 定义 Kubernetes API 的版本,这里是 v1。

  • kind: 定义要创建的 Kubernetes 资源类型,这里是 Pod。

  • metadata: 包含有关 Pod 的元信息。

    • name: 指定 Pod 的名称为 “counter”。
  • spec: 定义了 Pod 的规格,包括容器和卷的配置。

    • containers: 定义 Pod 中的容器列表。
      • name: count: 第一个容器的名称为 “count”。
      • image: busybox:1.28: 使用的容器镜像是 BusyBox 1.28。
      • args: 定义容器的启动参数。
      • 在容器内运行的脚本,不断向两个不同的文件写入计数和时间信息,其中 /var/log/1.log 包含计数和时间信息,而 /var/log/2.log 包含时间信息和附加的 INFO 标签。
      • volumeMounts: 挂载卷到容器的指定路径。
        • name: varlog: 指定卷的名称。
        • mountPath: /var/log: 将卷挂载到容器的 /var/log 路径下。
    • volumes: 定义 Pod 中使用的卷。
      • name: varlog: 定义一个名为 “varlog” 的卷。
      • emptyDir: {}: 使用空目录作为卷,这意味着该卷的生命周期与 Pod 相同,但可以在 Pod 中的不同容器之间共享数据。

这个 Pod 包含两个容器,一个叫做 “count”,它负责不断地往两个文件写入计数和时间信息。这个示例主要用于演示容器内的文件共享。其中,/var/log/1.log/var/log/2.log 是通过挂载名为 “varlog” 的空目录卷实现的。

[root@master log]# kubectl apply -f two-file-counter-pod.yaml 
pod/counter created
[root@master log]# kubectl get pod
NAME      READY   STATUS    RESTARTS   AGE
counter   1/1     Running   0          25s
[root@master log]# 
[root@master log]# kubectl apply -f two-file-counter-pod.yaml 
pod/counter created
[root@master log]# kubectl get pod
NAME      READY   STATUS    RESTARTS   AGE
counter   1/1     Running   0          25s
nginx     1/1     Running   3          43h
redis     1/1     Running   0          5h13m
[root@master log]# kubectl exec counter -it -- sh
/ # cd /var/log/
/var/log # ls
1.log  2.log
/var/log # cat 1.log 
0: Thu Mar  7 09:15:32 UTC 2024
1: Thu Mar  7 09:15:33 UTC 2024
2: Thu Mar  7 09:15:34 UTC 2024
3: Thu Mar  7 09:15:35 UTC 2024
4: Thu Mar  7 09:15:36 UTC 2024
5: Thu Mar  7 09:15:37 UTC 2024
6: Thu Mar  7 09:15:38 UTC 2024
7: Thu Mar  7 09:15:39 UTC 2024
8: Thu Mar  7 09:15:40 UTC 2024
9: Thu Mar  7 09:15:41 UTC 2024

3.7、进一步做边车实验

image-20240307172026898

[root@master log]# vim sidecar-1.yaml
apiVersion: v1
kind: Pod
metadata:name: counter
spec:containers:- name: countimage: busybox:1.28args:- /bin/sh- -c- >i=0;while true;doecho "$i: $(date)" >> /var/log/1.log;echo "$(date) INFO $i" >> /var/log/2.log;i=$((i+1));sleep 1;done      volumeMounts:- name: varlogmountPath: /var/log- name: count-log-1image: busybox:1.28args: [/bin/sh, -c, 'tail -n+1 -F /var/log/1.log']volumeMounts:- name: varlogmountPath: /var/log- name: count-log-2image: busybox:1.28args: [/bin/sh, -c, 'tail -n+1 -F /var/log/2.log']volumeMounts:- name: varlogmountPath: /var/logvolumes:- name: varlogemptyDir: {}
[root@master log]# 

这是一个 Kubernetes Pod 的 YAML 文件,创建了一个包含三个容器的 Pod,其中一个容器用于不断地向两个文件写入计数和时间信息,而另外两个容器则分别用于监视这两个文件的内容。以下是对 YAML 文件的解释:

  • apiVersion: 定义 Kubernetes API 的版本,这里是 v1。

  • kind: 定义要创建的 Kubernetes 资源类型,这里是 Pod。

  • metadata: 包含有关 Pod 的元信息。

    • name: 指定 Pod 的名称为 “counter”。
  • spec: 定义了 Pod 的规格,包括容器和卷的配置。

    • containers: 定义 Pod 中的容器列表。
      • name: count: 第一个容器的名称为 “count”。
        • image: busybox:1.28: 使用的容器镜像是 BusyBox 1.28。
        • args: 定义容器的启动参数。
        • 在容器内运行的脚本,不断向两个文件写入计数和时间信息,其中 /var/log/1.log 包含计数和时间信息,而 /var/log/2.log 包含时间信息和附加的 INFO 标签。
        • volumeMounts: 挂载卷到容器的指定路径。
          • name: varlog: 指定卷的名称。
          • mountPath: /var/log: 将卷挂载到容器的 /var/log 路径下。
      • name: count-log-1: 第二个容器的名称为 “count-log-1”。
        • image: busybox:1.28: 使用的容器镜像是 BusyBox 1.28。
        • args: 定义容器的启动参数,用于监视 /var/log/1.log 文件的内容。
        • volumeMounts: 挂载卷到容器的指定路径。
          • name: varlog: 指定卷的名称。
          • mountPath: /var/log: 将卷挂载到容器的 /var/log 路径下,以便与第一个容器共享文件。
      • name: count-log-2: 第三个容器的名称为 “count-log-2”。
        • image: busybox:1.28: 使用的容器镜像是 BusyBox 1.28。
        • args: 定义容器的启动参数,用于监视 /var/log/2.log 文件的内容。
        • volumeMounts: 挂载卷到容器的指定路径。
          • name: varlog: 指定卷的名称。
          • mountPath: /var/log: 将卷挂载到容器的 /var/log 路径下,以便与第一个容器共享文件。
    • volumes: 定义 Pod 中使用的卷。
      • name: varlog: 定义一个名为 “varlog” 的卷。
      • emptyDir: {}: 使用空目录作为卷,这意味着该卷的生命周期与 Pod 相同,但可以在 Pod 中的不同容器之间共享数据。
[root@master log]# kubectl apply -f sidecar-1.yaml 
pod/counter created
[root@master log]# kubectl get pod
NAME      READY   STATUS    RESTARTS   AGE
counter   3/3     Running   0          6s
[root@master log]# kubectl logs counter count-log-1 #看日志
0: Thu Mar  7 09:31:23 UTC 2024
1: Thu Mar  7 09:31:24 UTC 2024
2: Thu Mar  7 09:31:25 UTC 2024
. . .
[root@master log]# kubectl logs counter count-log-2 #看日志
Thu Mar  7 09:31:23 UTC 2024 INFO 0
Thu Mar  7 09:31:24 UTC 2024 INFO 1
Thu Mar  7 09:31:25 UTC 2024 INFO 2
Thu Mar  7 09:31:26 UTC 2024 INFO 3
. . . 

4、容器类型

4.1、sidecar

sidecar:边车

在容器化的应用程序中,有时候我们希望多个容器能够共享资源或协同工作。为了实现这样的需求,可以使用一种设计模式称为Sidecar

Sidecar 是一种附加到主要容器旁边的辅助容器。主要容器是应用程序的核心组件,而 Sidecar 则提供了额外的功能和服务。Sidecar 容器与主要容器运行在同一个 Pod 中,它们共享相同的网络和存储空间,可以通过本地主机通信。

Sidecar 容器可以提供各种不同的功能,例如:

  1. 日志收集:Sidecar 容器可以负责收集主要容器的日志,并将其发送到中央日志系统,以便进行集中管理和分析。
  2. 监控和指标收集:Sidecar 容器可以收集主要容器的监控数据和指标,并将其发送到监控系统,以便进行实时监控和分析。
  3. 安全代理:Sidecar 容器可以作为安全代理,处理主要容器的网络流量加密、认证和授权等安全功能。
  4. 数据同步:Sidecar 容器可以负责将主要容器产生的数据同步到外部存储系统,或者从外部存储系统读取数据并同步到主要容器。
  5. 缓存代理:Sidecar 容器可以作为缓存代理,提供缓存服务,加速主要容器的访问速度。
  6. 动态配置:Sidecar 容器可以负责动态更新主要容器的配置,以适应不同的环境和需求。

通过将这些功能模块化为 Sidecar 容器,我们可以实现更好的代码隔离、模块化和可维护性。同时,由于 Sidecar 容器与主要容器运行在同一个 Pod 中,它们之间可以通过本地主机通信,减少了网络开销和延迟。

总而言之,Sidecar 是一种在容器化应用程序中实现多个容器共享资源和协同工作的设计模式,可以提供额外的功能和服务,以提高应用程序的可扩展性、可靠性和安全性。

4.2、pause容器

创建pod的时候最先创建的容器

在Kubernetes中,每个Pod都有一个特殊的容器称为pause容器。这个容器是由Kubernetes自动添加到每个Pod中的,它在技术上并不执行任何有用的工作。让我们来解释一下pause容器的作用和原理。

pause容器的主要目的是创建一个网络命名空间(network namespace)和一个IPC命名空间(inter-process communication namespace),并在这些命名空间中挂载一个共享的网络和IPC命名空间。这个共享的命名空间允许Pod中的其他容器共享网络和进程间通信。

具体来说,当Pod创建时,Kubernetes会创建一个共享网络命名空间和IPC命名空间,并在这些命名空间中启动一个"pause"容器。然后,Pod中的其他容器会以pause容器的命名空间作为基础,与``pause`容器共享网络和IPC。

这种设计的好处是,通过共享命名空间,Pod中的容器可以直接通过localhost进行通信,而无需进行网络转发或IPC机制。同时,通过将网络和IPC命名空间与pause容器分离,可以实现更好的资源隔离和安全性。

需要注意的是,pause容器本身不会执行任何实际的任务或应用程序代码。它只是一个占位符容器,用于创建和管理共享的网络和IPC命名空间。

总结起来,pause容器在Kubernetes中起到了创建和管理共享网络和IPC命名空间的作用,使得Pod中的其他容器可以直接通过localhost进行通信。它是Kubernetes网络和容器隔离机制的关键组成部分。

042c895fc3ae409dd18de7d0f4d3af1

65674048f0fd24ba907d649aa2ab578

pause容器–》把pod的公用的命名空间都创建好–》init容器—》app容器

4.3、init 初始化容器(Init Container)

Kubernetes中,每个Pod可以包含一个或多个初始化容器(Init Container)。初始化容器是在Pod中的其他容器启动之前运行的短暂容器,用于执行一些初始化任务或准备工作。

是有先后顺序的!

init容器是去铺路的,第一批拓荒的人,像极了《剑来》中的仙蔚道长,他是开路之人。

总结起来,初始化容器是在Pod中运行的短暂容器,用于执行一次性的初始化任务或准备工作。通过初始化容器,可以实现在启动其他容器之前完成一些必要的操作,如加载配置、初始化数据库等。

image-20240307175815155

相当于:我必须先启动:redis,mysql和nginx 容器,才能启动主容器:flask web 不然跑不起来

下面的例子定义了一个具有 2 个 Init 容器的简单 Pod。 第一个等待 myservice 启动, 第二个等待 mydb 启动。 一旦这两个 Init 容器都启动完成,Pod 将启动 spec 节中的应用容器。

[root@master pod]# mkdir init
[root@master pod]# cd init/
[root@master init]# vim 1.yaml
apiVersion: v1
kind: Pod
metadata:name: myapp-podlabels:app.kubernetes.io/name: MyApp
spec:containers:- name: myapp-containerimage: busybox:1.28command: ['sh', '-c', 'echo The app is running! && sleep 3600']initContainers:- name: init-myserviceimage: busybox:1.28command: ['sh', '-c', "until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done"]- name: init-mydbimage: busybox:1.28command: ['sh', '-c', "until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done"]
[root@master init]# kubectl apply -f 1.yaml 
pod/myapp-pod created
[root@master init]# kubectl get pod -o wide
NAME        READY   STATUS     RESTARTS   AGE    IP              NODE     NOMINATED NODE   READINESS GATES
myapp-pod   0/1     Init:0/2   0          15s    10.244.247.21   node-2   <none>           <none>
[root@master init]# 

Init状态---->初始化状态

[root@master init]# kubectl logs myapp-pod -c init-myservice #看日志
nslookup: can't resolve 'myservice.default.svc.cluster.local'
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
waiting for myservice
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

创建服务:

[root@master init]# vim myservice.yaml
---
apiVersion: v1
kind: Service
metadata:name: myservice
spec:ports:- protocol: TCPport: 80targetPort: 9376
---
apiVersion: v1
kind: Service
metadata:name: mydb
spec:ports:- protocol: TCPport: 80targetPort: 9377
[root@master init]# 

查看状态

[root@master init]# kubectl apply -f myservice.yaml 
service/myservice created
service/mydb created
[root@master init]# kubectl get -f 1.yaml 
NAME        READY   STATUS    RESTARTS   AGE
myapp-pod   1/1     Running   0          4m46s
[root@master init]# 

4.4、app容器

应用程序容器—》跑业务代码的容器

5、服务发现

让外面的人发现k8s集群内部的服务

pod: 提供web—》在k8s集群内部的 --》ip 私网ip地址

server —》定义服务–》去发布k8s内部的pod,让外面的机器可以访问集群内部的pod

本质上其实是在做DNAT

6、小练习

自己写yaml文件,启动一个pod,里面有2个容器,具体的自己定 启动nginx容器 启动一个busybox容器 定义卷,两个容器都挂着这个卷

[root@master lianxi]# vim my.yaml 
apiVersion: v1
kind: Namespace
metadata:name: halou-gh---
apiVersion: v1
kind: Pod
metadata:name: gh-nginx-busyboxnamespace: halou-gh
spec:nodeName: node-1containers:- name: gh-nginximage: nginx:latestimagePullPolicy: IfNotPresentvolumeMounts:- name: varghmountPath: /var/ghports:- containerPort: 80- name: gh-busyboximage: busybox:latestimagePullPolicy: IfNotPresentcommand: ["/bin/sh"]args: ["-c", "i=0; while true; do echo \"$i: $(date)\" >> /var/gh/1.log; i=$((i+1)); sleep 1; done"]volumeMounts:- name: varghmountPath: /var/ghvolumes:- name: varghemptyDir: {}
[root@master lianxi]# 
[root@master lianxi]# kubectl apply -f my.yaml 
namespace/halou-gh created
pod/gh-nginx-busybox created
[root@master lianxi]# kubectl get pod -n halou-gh
NAME               READY   STATUS    RESTARTS   AGE
gh-nginx-busybox   2/2     Running   0          12s
[root@master lianxi]# 

在这遇到个问题,就是写yaml的时候,busybox 我没有动作,他进入容器之后,就会启动后立即完成(Completed)而不是保持运行状态。这通常表明容器执行的任务已完成,然后容器自动退出。这就使得:BusyBox 容器中,它只运行了一次,并在任务完成后退出。

所以得加个动作:sleep 命令添加到启动命令中,以保持容器处于运行状态。

> command: ["/bin/sh"]
>   args: ["-c", "i=0; while true; do echo \"$i: $(date)\" >> /var/gh/1.log; i=$((i+1)); sleep 1; done"]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/727515.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

融资项目——通过OpenFeign在分布式微服务框架中实现微服务的远程调用

1.OpenFeign配置 首先&#xff0c;在需要调用其他的微服务的微服务中引入相关依赖。&#xff08;大多数项目中各微服务需要互相调用&#xff0c;可以直接在每个微服务中引入依赖&#xff09; <!--服务调用--><dependency><groupId>org.springframework.clou…

【Memory协议栈】NVRAM Manager 模块介绍

目录​​​​​​​ 前言 正文 1.功能简介 2.关键概念 3.功能详解 3.1 内存硬件抽象层Ea/Fee的寻址方案 3.2 基本存储对象Basic storage objects 3.2.1 NV Block 3.2.2 RAM Block 3.2.3 ROM Block 3.2.4 Administrative block 3.2.5 NV Block Header 3.3块管理类型…

云手机实现全方位的海外舆情监测

近年来&#xff0c;随着各大品牌在海外市场的崛起&#xff0c;海外舆情监测变得尤为重要。企业在拓展国际业务的同时&#xff0c;面临着海外市场的信息难获取、竞争激烈等问题。为解决这一难题&#xff0c;Ogcloud推出的云手机应运而生&#xff0c;为企业提供全方位的海外舆情监…

【软件测试】如何申请专利?

一、专利类型 在软件测试领域&#xff0c;可以申请发明专利、实用新型专利和外观设计专利。其中&#xff0c;发明专利是最常见的专利类型&#xff0c;它保护的是软件测试方法、系统和装置等技术方案。 二、申请专利的条件 申请专利需要满足新颖性、创造性和实用性三个条件。…

PEIS源码 健康体检中心源码 C/S

目录 一、系统概述 二、系统开发环境 三、系统功能 检前管理 检中管理 检后管理 设备对接-PACS 设备对接-彩超 LIS-结果录入、审核、外送结果自动导入 一、系统概述 体检系统&#xff0c;是专为体检中心/医院体检科等体检机构&#xff0c;专门开发的全流程管理系…

HTML5:七天学会基础动画网页9

在进行接下来的了解之前我们先来看一下3d的xyz轴&#xff0c;下面图中中间的平面就相当于电脑屏幕&#xff0c;z轴上是一个近大远小的效果。 3d转换属性 transform 2D或3D转换 transform-origin 改变旋转点位置 transform-style 嵌套元素在3D空间如何显 …

JumpServer 简介安装

目录 1、概念介绍 JumpServer 概述 JumpServer 功能 JumpServer 组件 JumpServer 架构 2、前置安装 环境要求 安装 ELRepo 库 更新内核 设置 grub2 安装 Python 配置 Python 虚拟环境 3、安装 Jumpserver Core 组件 下载安装 替换客户端组件 安装 Python 依赖库…

【Web】浅浅地聊SnakeYaml反序列化两条常见利用链

目录 关于Yaml 关于SnakeYaml SnakeYaml反序列化利用 JdbcRowSetImpl链 ScriptEngineManager链 复现 基本原理 继续深入 关于Yaml 学过SpringBoot开发的师傅都知道&#xff0c;YAML和 Properties 文件都是常见的配置文件格式&#xff0c;用于存储键值对数据。 这里举…

干货分享③:免费制作产品管理系统!

他来了&#xff0c;他来了&#xff0c;他带着码上飞CodeFlying走来了&#xff01;今天继续为大家带来一期干货分享&#xff0c;教大家如何免费使用码上飞来的开发产品管理系统 &#xff01; 一、登陆官网 码上飞 CodeFlying | AI 智能软件开发平台&#xff01; 点击立即体验注…

服务器严重不够啊

必需采购服务器了&#xff0c;

一个比较全面实用的C#帮助类、工具类库

前言 经常会有一些同学会问为什么感觉我身边的大佬写一个功能会这么快&#xff1f;一个类似的模块大佬可能半天就搞定了&#xff0c;而我要搞一两天。其实工作久了你会发现很多常用公共的帮助类和工具类&#xff0c;如常见的Excel数据导入导出、文件操作、字符串操作、数据转换…

从零搭建React18.2+ReactRoute6.22+TS5+RTK2.2搭配antd5+antd-style书写All in Js完整体验项目规范

1. 使用CRA创建项目 全局设置npm淘宝镜像源 npm config set registry https://registry.npmmirror.com -g使用最新版create-react-app初始化项目结构 npx create-react-app custom-template --template typescript初始化项目之后在package.json文件中配置使用node>18.0.0…

WordPress供求插件API文档:用户登录

该文档为WordPress供求插件文档&#xff0c;详情请查看 WordPress供求插件&#xff1a;一款专注于同城生活信息发布的插件-CSDN博客文章浏览阅读67次。WordPress供求插件&#xff1a;sliver-urban-life 是一款专注于提供同城生活信息发布与查看的插件&#xff0c;该插件可以实…

windows下编译boost1.84.0库

boost系列文章目录 文章目录 boost系列文章目录前言一、boost编译二、boost使用三 、参考 前言 Boost简介 官方网址 Boost提供免费的同行评审的可移植C源代码库。 我们强调与C标准库配合良好的库。Boost库旨在广泛使用&#xff0c;并可在广泛的应用程序中使用。Boost许可证鼓…

SpringBoot+Maven多环境配置模式

我这里有两个配置文件 然后在最外层的父级POM文件里面把这个两个配置文件写上 <profiles><profile><id>druid</id><properties><spring.profiles.active>druid</spring.profiles.active></properties><activation><…

sensor_msgs::LaserScan雷达数据转换成pcl::PointXYZ数据类型

文章目录 创建工作空间、功能包功能包文件 package.xml头文件、源码文件laserscan_to_pointcloud.hlaserscan_to_pointcloud.cc 代码解读编译文件 CMakeLists.txt运行效果 截图 创建工作空间、功能包 catkin_create_pkg laserscan_to_pointcloud sensor_msgs roscpp pcl_conve…

分享关于如何解决系统设计问题的逐步框架

公司广泛采用系统设计面试&#xff0c;因为在这些面试中测试的沟通和解决问题的技能与软件工程师日常工作所需的技能相似。面试官的评估基于她如何分析一个模糊的问题以及如何逐步解决问题。测试的能力还包括她如何解释这个想法&#xff0c;与他人讨论&#xff0c;以及评估和优…

回溯算法07-子集(Java/子集问题)

.子集 题目描述 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[],[…

ChatGPT高效提问——说明提示技巧

ChatGPT高效提问——说明提示技巧 现在&#xff0c;让我们开始体验“说明提示技巧”&#xff08;IPT, Instructions Prompt Technique&#xff09;和如何用它生成来自ChatGPT的高质量的文本。说明提示技巧是一个通过向ChatGPT提供需要依据的具体的模型的说明来指导ChatGPT输出…

不伤耳朵的蓝牙耳机推荐,骨传导耳机选购前必知的几大要点

在目前的蓝牙耳机市场上&#xff0c;骨传导蓝牙耳机以其独特的设计和不伤耳朵的好处而受到广泛关注。骨传导蓝牙耳机通过骨头传导声音&#xff0c;无需进入耳道&#xff0c;从而减少了耳朵的不适和潜在伤害。 骨传导蓝牙耳机这种开放式的设计允许用户在享受音乐的同时&#xf…