运行应用
# 1. 简述
本篇文章主要讲解内容如下:
- 在
Kubernetes运行应用流程。 - 学习涉及到的相关概念和术语。
# 2. 运行应用流程
在Docker的世界中,调度的原子单位是容器;而在Kubernetes的世界中,调度的原子单位是Pod,应用都是运行在Pod中,管理应用,就是在管理Pod;用户无法直接在Kubernetes集群中运行一个容器,容器必须并且总是需要在Pod中才能运行。
# 2.1 创建Deployment
Kubernetes通过各种Controller来管理Pod的生命周期。为了满足不同业务场景,Kubernetes开发了Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job等多种Controller。最常用的是Deployment。
# a. 编写配置
cat <<EOF > /root/k8s/httpd_deployment.yaml
apiVersion: apps/v1 # 配置格式版本
kind: Deployment #资源类型,Deployment
metadata:
name: httpd-deployment #Deployment 的名称
spec:
replicas: 2 # 副本数量
selector: #标签选择器,
matchLabels: #选择包含标签app:httpd_server的资源
app: httpd_pod
template: #Pod模板信息
metadata:
labels: #Pod的标签
app: httpd_pod
spec:
containers:
- name: httpd #container的名称
image: httpd #使用镜像httpd
EOF
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# b. 创建资源
# 创建资源
$ kubectl apply -f /root/k8s/httpd_deployment.yaml
# 查看创建deployment
$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
httpd-deployment 2/2 2 2 6m13s
# 查看创建的pod
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
httpd-deployment-65f7496c48-77j46 1/1 Running 0 38m
httpd-deployment-65f7496c48-rqknm 1/1 Running 0 38m
2
3
4
5
6
7
8
9
10
11
# c. 访问资源
# 查看Pod IP信息
$ kubectl get pod -o wide
NAME READY STATUS ... IP NODE ...
httpd-deployment-65f7496c48-77j46 1/1 Running ... 10.244.104.5 node2 ...
httpd-deployment-65f7496c48-rqknm 1/1 Running ... 10.244.166.138 node1 ...
# 访问Pod
$ curl 10.244.104.5
<html><body><h1>It works!</h1></body></html>
$ curl 10.244.166.138
<html><body><h1>It works!</h1></body></html>
2
3
4
5
6
7
8
9
10
# 2.2 创建Service
在Kubernetes中,Pod是极不稳定的,随时可能会因为故障或者其他原因死掉,虽然每个Pod都有IP,但是当Controller用新Pod替代死掉的Pod时,新Pod会分配到新的IP地址。这样就会产生了一个问题: 如果一组Pod对外提供服务(比如HTTP),它们的IP很有可能发生变化,那么客户端如何找到并访问这个服务呢?
Kubernetes给出的解决方案是Service。
# a. 编写配置
$ cat <<EOF > /root/k8s/httpd_service.yaml
apiVersion: v1 # 配置格式版本
kind: Service #资源类型,Service
metadata:
name: httpd-src #service名称
spec:
selector:
app: httpd_pod #关联 lable为app: httpd_pod的Pod
ports:
- name: http
protocol: TCP
port: 8080 # ClusterIP监听的端口
targetPort: 80 # Pod监听的端口
EOF
2
3
4
5
6
7
8
9
10
11
12
13
14
# b. 创建资源
# 创建
$ kubectl apply -f httpd_service.yaml
service/httpd-src created
# 查看service
$ kubectl get service -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
httpd-src ClusterIP 10.101.207.83 <none> 8080/TCP 4m20s app=httpd_pod
..
2
3
4
5
6
7
8
# c. 访问验证
# 访问,通过 kubectl logs -f pod名称 可以发现是轮询访问
$ curl 10.101.207.83:8080
<html><body><h1>It works!</h1></body></html>
2
3
# d. 暴露外网访问
除了Cluster内部可以访问Service,很多情况下我们也希望应用的Service能够暴露给Cluster外部。Kubernetes提供了多种类型的Service,默认是ClusterIP。我们可以修改类型为NodePort,来实现外部访问。
修改配置文件:
apiVersion: v1
kind: Service
metadata:
name: httpd-src
spec:
type: NodePort # 这里设置成NodePort
selector:
app: httpd_pod
ports:
- name: http
protocol: TCP
nodePort: 30000 # 指定nodePort端口,限制范围为:30000-32767
port: 8080
targetPort: 80
2
3
4
5
6
7
8
9
10
11
12
13
14
覆盖发布:
# 发布
$ kubectl apply -f httpd_service.yaml
# 查看service
$ kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
httpd-src NodePort 10.101.207.83 <none> 8080:30000/TCP 17m
...
2
3
4
5
6
7
master节点ip是192.168.148.130, 访问 http://192.168.148.130:30000

# 3. 概念
# 3.1 Pod
Kubernetes并不直接运行容器,而是使用一个抽象的资源对象来封装一个或者多个容器,这个抽象即为Pod,它也是Kubernetes的最小调度单元。
同一Pod中的容器共享网络名称空间和存储资源(Volume),但彼此之间又在Mount、User及PID等名称空间上保持了隔离。
尽管Pod中可以包含多个容器,但是作为最小调度单元,它应该尽可能地保持“小”,即通常只应该包含一个主容器,以及必要的辅助型容器(sidecar)
# 3.2 Deployment
Deployment是Kubernetes控制器的一种实现,它构建于ReplicaSet控制器之上,可为Pod和ReplicaSet资源提供声明式更新。相比较而言,Pod和ReplicaSet是较低级别的资源,它们很少被直接使用。
Deployment、ReplicaSet和Pod的关系如下图所示

Deployment控制器资源的主要职责同样是为了保证Pod资源的健康运行,其大部分功能均可通过调用ReplicaSet控制器来实现,同时还增添了部分特性:
- 事件和状态查看:可以查看升级的详细进度和状态。
- 回滚:当升级
Pod镜像或者相关参数的时候发现问题,可以使用回滚操作回滚到指定的版本。 - 版本记录:每一次对
Deployment的操作都能保存下来,给予后续可能的回滚使用。 - 暂停和启动:对于每一次升级,都能够随时暂停和启动。
- 多种自动更新方案:
Recreate(重建更新):删除所有已存在的Pod,重新创建新的。RollingUpdate(滚动更新):逐步替换旧有的Pod至新的版本。
# 3.3 Service
Service是Kubernetes的核心资源类型之一,通常可看作微服务的一种实现。事实上它是一种抽象:通过规则定义出由多个Pod对象组合而成的逻辑集合,以及访问这组Pod的策略。
Service资源基于标签选择器将一组Pod定义成一个逻辑组合,并通过自己的IP地址和端口调度代理请求至组内的Pod对象之上,如下图所示:
