什么是pod
pod是k8s最重要的基本概念。每个pod包含一个或多个紧密相关的用户业务容器。是一起运行在同一个工作节点上,以及同一个Linux命名空间中。

每个pod就像是一个独立的逻辑机器,拥有自己的IP、主机名、进程等,运行一个独立的应用程序。
pod是逻辑主机,一个pod的所有容器都运行在同一个逻辑机器上。

一个pod包含多个容器时,这些容器总是运行在同一个工作节点上,一个pod绝不可能跨多个工作节点。
pod分类:
pod分为两种类型:普通的pod和静态pod(static pod)

pod的组成

在这里插入图片描述

每个pod都有一个特殊的被称为“根容器”的Pause容器,除了Pause容器,每个pod包含一个或多个紧密相关的用户业务容器

为什么k8s 会设计出一个全新的pod的概念
原因一:

在一组容器作为一个单元的情况下,我们难以简单的对“整体”进行判断及有效行动

引入与业务无关并且不易死亡的Pause容器 作为Pod的根容器,以它的状态代表整个容器组的状态。

原因二:

pod的多个业务容器:共享 Pause容器的ip,共享Pause容器挂接的volume。

这样解决了业务容器之间的通信和文件共享的问题!

Pod的基本用法
场景一:k8s部署 Guestbook 留言板
在这里插入图片描述

留言板系统架构部署图

先定义RC来创建Pod,然后定义与之关联的Service

1 安装redis集群(主从)

vi redis-master-controller.yaml

apiVersion: v1
kind: ReplicationController
metadata:
name: redis-master
labels:
name: redis-master
spec:
replicas: 1
selector:
name: redis-master
template:
metadata:
labels:
name: redis-master
spec:
containers:
- name: master
image: kubeguide/redis-master
ports:
- containerPort: 6379

创建完成之后,在master节点上发布到集群中

[root@master yaml]# kubectl create -f redis-master-controller.yaml
replicationcontroller “redis-master” created
用kubectl get 命令确认RC和Pod 创建成功

[root@k8s-master ~]# kubectl get rc -o wide
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR

redis-master 1 1 1 92m master kubeguide/redis-master name=redis-master

[root@master yaml]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE
redis-master-brh9j 1/1 Running 0 4m
redis-master Pod 已创建且正常运行后,在创建与之关联的Service

[root@master yaml]# vi redis-master-service.yaml

apiVersion: v1
kind: Service
metadata:
name: redis-master
labels:
name: redis-master
spec:
ports:

  • port: 6379
    targetPort: 6379
    selector:
    name: redis-master
    运行kubectl create 命令创建该service

[root@master yaml]# kubectl create -f redis-master-service.yaml
service “redis-master” created
运行kubectl get 命令确认Service 运行

[root@k8s-master ~]# kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR

redis-master ClusterIP 10.96.176.142 6379/TCP 92m name=redis-master
已经成功启动了redis-master 服务,下面再创建redis-slave RC 和Service

vi redis-slave-controller.yaml

apiVersion: v1
kind: ReplicationController
metadata:
name: redis-slave
labels:
name: redis-slave
spec:
replicas: 2
selector:
name: redis-slave
template:
metadata:
labels:
name: redis-slave
spec:
containers:
- name: slave
image: kubeguide/guestbook-redis-slave
env:
- name: GET_HOSTS_FROM
value: env
ports:
- containerPort: 6379
同上,在master节点发布到集群中

[root@master yaml]# kubectl create -f redis-slave-controller.yaml
replicationcontroller “redis-slave” created

创建与redis-slave 相关的Service 服务

[root@master yaml]# vi redis-slave-service.yaml

apiVersion: v1
kind: Service
metadata:
name: redis-slave
labels:
name: redis-slave
spec:
ports:

  • port: 6379
    targetPort: 6379
    selector:
    name: redis-slave
    运行kubectl create 命令发布该Service

[root@master yaml]# kubectl create -f redis-slave-service.yaml
service “redis-slave” created

运行kubectl create 确认 Service 运行

[root@k8s-master ~]# kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR

redis-master ClusterIP 10.96.176.142 6379/TCP 92m name=redis-master
redis-slave ClusterIP 10.96.226.3 6379/TCP 89m name=redis-slave

2 安装Frentend 集群

接下来再创建frontend RC 和Service

[root@master yaml]# vi frontend-controller.yaml

apiVersion: v1
kind: ReplicationController
metadata:
name: frontend
spec:
replicas: 3
selector:
name: frontend
template:
metadata:
labels:
name: frontend
spec:
containers:
- name: frontend
image: kubeguide/guestbook-php-frontend
env:
- name: GET_HOSTS_FROM
value: env
ports:
- containerPort: 80
发布

[root@master yaml]# kubectl create -f frontend-controller.yaml
replicationcontroller “frontend” created
创建与frontend 相关联的Service 服务

[root@master yaml]# vi frontend-service.yaml

apiVersion: v1
kind: Service
metadata:
name: frontend
labels:
name: frontend
spec:
type: NodePort
ports:

  • port: 80
    nodePort: 30003
    selector:
    name: frontend

运行kubectl create 命令发布到集群中

[root@master yaml]# kubectl create -f frontend-service.yaml
service “frontend” created

运行kubectl get 命令确认frontend Service 运行

[root@k8s-master ~]# kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
frontend NodePort 10.96.250.46 80:30003/TCP 13m name=frontend

3 web 页面浏览

在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐