Kubernetes快速入门

2023-11-09

前言:

本文旨在为Kubernetes入门使用者,提供使用Kubernetes需要掌握的基本知识。

1. 基础概念

1.1 集群与节点

kubernetes是一个开源的容器引擎管理平台,实现容器化应用的自动化部署,任务调度,弹性伸缩,负载均衡等功能,cluster是由master和node两种角色组成。

  • master负责管理集群,master包含kube-apiserver, kube-controller-manager,kube-scheduler,etcd等组件。
  • node节点运行容器应用,由Container Runtime,kubelet和kube-proxy组成,其中Container Runtime可能是Docker, rke,containerd, node节点可由物理机或者虚拟机组成。

 1、查看master组件角色

[root@node-1 ~]# kubectl get componentstatuses 
NAME STATUS MESSAGE ERROR
scheduler Healthy ok 
controller-manager Healthy ok 
etcd-0 Healthy {"health":"true"} 

2、查看node节点列表

[root@node-1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
node-1 Ready master 26h v1.14.1
node-2 Ready <none> 26h v1.14.1
node-3 Ready <none> 26h v1.14.

3、查看node节点详情

[root@node-1 ~]# kubectl describe node node-3
Name: node-3
Roles: <none>
Labels: beta.kubernetes.io/arch=amd64。#标签和Annotation
……

1.2 容器与应用

kubernetes是容器编排引擎,其负责容器的调度,管理和容器的运行,但kubernetes调度最小单位并非是container,而是pod,pod中可包含多个container,通常集群中不会直接运行pod,而是通过各种工作负载的控制器如Deployment,ReplicaSets, DaemonSets的方式运行,为啥?因为控制器能够保证pod状态的一致性,正如官方所描述的一样“make sure the current state match to the desire state”, 确保当前状态和预期的一致,简单来说就是pod异常了,控制器会在其他节点重建,确保集群当前运行的pod和预期设定的一致。

  • pod是kubernetes中运行的最小单元
  • pod中包含一个容器或多个容器
  • pod不会单独使用,需要有工作负载来控制,如Deployments,StatefulSets,DaemonSets,CronJobs等

  • Pod,kubernetes中最小的调度单位,封装容器,包含一个pause容器和应用容器,容器之间共享相同的命名空间,网络,存储,共享进程。
  • Deployments,部署组也称应用,严格来说是无状态化工作负载,另外一种有状态化工作负载是StatefulSets,Deployments是一种控制器,可以控制工作负载的副本数 replicas,通过kube-controller-manager中的Deployments Controller实现副本数状态的控制。

1.3 服务访问

kubernetes中pod是实际运行的载体,pod依附于node中,node可能会出现故障,kubernetes的控制器如replicasets会在其他node上重新拉起一个pod,新的pod会分配一个新的IP;再者,应用部署时会包含多个副本replicas,如同个应用deployments部署了3个pod副本,pod相当于后端的Real Server,如何实现这三个应用访问呢?对于这种情况,我们⼀般会在Real Server前⾯加⼀个负载均衡Load Balancer,service就是pod的负载均衡调度器,service将动 态的pod抽象为⼀个服务,应⽤程序直接访问service即可,service会⾃动将请求转发到后端的 pod。负责service转发规则有两种机制:iptables和ipvs,iptables通过设置DNAT等规则实现 负载均衡,ipvs通过ipvsadm设置转发规则。

根据服务不同的访问方式,service分为如下几种类型:ClusterIP,NodePort,LoadBalancer和ExternalName,可通过type设置。

  • ClusterIP,集群内部互访,与DNS结合实现集群内部的服务发现; 
  • NodePort,通过NAT将每个node节点暴露一个端口实现外部访问;
  • LoadBalancer,实现云厂商外部接⼊⽅式的接⼝,需要依赖云服务提供商实现具体技术 细节,如腾讯云实现与CLB集成;
  • ExternalName,通过服务名字暴露服务名,当前可由ingress实现,将外部的请求以域名 转发的形式转发到集群,需要依附具体的外部实现,如nginx,traefik,各⼤云计算⼚商实 现接⼊细节。

pod是动态变化,ip地址可能会变化(如node故障),副本数可能会变化,如应用扩展scale up,应用锁容scale down等,service如何识别到pod的动态变化呢?答案是labels,通过labels⾃动会过滤出某个应⽤的Endpoints,当pod变化时会⾃动更新Endpoints,不同的应⽤ 会有由不同的label组成。labels相关可以参考 下https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/

 2. 创建应用

我们开始部署一个应用即deployments,kubernetes中包含各种workload如无状态化的Deployments,有状态化的StatefulSets,守护进程的DaemonSets,每种workload对应不同的应用场景,我们先以Deployments为例入门,其它workload均以此类似,一般而言,在kubernetes中部署应用均以yaml文件方式部署,对于初学者而言,编写yaml文件太冗长,不适合初学,我们先用kubectl命令行方式实现API的接入。

1、部署nginx应⽤,部署三个副本

[root@node-1 ~]# kubectl run nginx-app-demo --image=nginx:1.7.9 --port
=80 --replicas=3 
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be r
emoved in a future version. Use kubectl run --generator=run-pod/v1 or 
kubectl create instead.
deployment.apps/nginx-app-demo create

2、查看应用列表,可以看到当前pod的状态均已正常,Ready是当前状态,AVAILABLE是目标状态

root@node-1 ~]# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-app-demo 3/3 3 3 72s

3、查看应用的详细信息,如下我们可以知道Deployments是通过ReplicaSets控制副本数的,由Replicaset控制Pod数

[root@node-1 ~]# kubectl describe deployments nginx-app-demo 
Name: nginx-app-demo #应⽤名称
Namespace: default #命名空间
CreationTimestamp: Sun, 11 Aug 2019 21:52:32 +0800
Labels: run=nginx-app-demo #labels,很重要,后续service通
过labels实现访问
Annotations: deployment.kubernetes.io/revision: 1 #滚动升级版
本号
Selector: run=nginx-app-demo #labels的选择器selector
Replicas: 3 desired | 3 updated | 3 total | 3 available 
| 0 unavailable #副本控制器
StrategyType: RollingUpdate #升级策略为RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge #RollingUpd
ate升级策略,即最⼤不超过25%的pod
Pod Template: #容器应⽤模版,包含镜像,port,存储等
 Labels: run=nginx-app-demo
 Containers:
 nginx-app-demo:
 Image: nginx:1.7.9
 Port: 80/TCP
 Host Port: 0/TCP
 Environment: <none>
 Mounts: <none>
 Volumes: <none>
Conditions: #当前状态
 Type Status Reason
 ---- ------ ------
 Available True MinimumReplicasAvailable
 Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: nginx-app-demo-7bdfd97dcd (3/3 replicas created) #Rep
licaSets控制器名称
Events: #运⾏事件
 Type Reason Age From Message
 ---- ------ ---- ---- -------
 Normal ScalingReplicaSet 3m24s deployment-controller Scaled up replica 

4、查看replicasets情况,通过查看可知replicasets副本控制器生成了三个pod

1. 查看replicasets列表
 [root@node-1 ~]# kubectl get replicasets
NAME DESIRED CURRENT READY AGE
nginx-app-demo-7bdfd97dcd 3 3 3 9m9s
2. 查看replicasets详情
[root@node-1 ~]# kubectl describe replicasets nginx-app-demo-7bdfd97dc
d 
Name: nginx-app-demo-7bdfd97dcd
Namespace: default
Selector: pod-template-hash=7bdfd97dcd,run=nginx-app-demo
Labels: pod-template-hash=7bdfd97dcd #labels,增加了⼀个hash的lab
el识别replicasets
 run=nginx-app-demo
Annotations: deployment.kubernetes.io/desired-replicas: 3 #滚动升级的
信息,副本树,最⼤数,应⽤版本
 deployment.kubernetes.io/max-replicas: 4
 deployment.kubernetes.io/revision: 1
Controlled By: Deployment/nginx-app-demo #副本的⽗控制,为nginx-app-demo
这个Deployments
Replicas: 3 current / 3 desired
Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template: #容器模板,继承于deployments
 Labels: pod-template-hash=7bdfd97dcd
 run=nginx-app-demo
 Containers:
 nginx-app-demo:
 Image: nginx:1.7.9
 Port: 80/TCP
 Host Port: 0/TCP
 Environment: <none>
 Mounts: <none>
 Volumes: <none>
Events: #事件⽇志,⽣成了三个不同的pod
 Type Reason Age From Message
 ---- ------ ---- ---- -------
 Normal SuccessfulCreate 9m25s replicaset-controller Created pod: nginx-app-demo-7bdfd97dcd-hsrft
 Normal SuccessfulCreate 9m25s replicaset-controller Created pod: nginx-app-demo-7bdfd97dcd-qtbzd
 Normal SuccessfulCreate 9m25s replicaset-controller Created pod: nginx-app-demo……

5、查看pod的情况,实际应用部署的载体,pod中部署了一个nginx容器并分配一个ip,可通过该ip直接访问应用

# 1. 查看pod的列表,和replicasets⽣成的名称⼀致
[root@node-1 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-app-demo-7bdfd97dcd-7t72x 1/1 Running 0 13m
nginx-app-demo-7bdfd97dcd-hsrft 1/1 Running 0 13m
nginx-app-demo-7bdfd97dcd-qtbzd 1/1 Running 0 13m
查看pod的详情
[root@node-1 ~]# kubectl describe pods nginx-app-demo-7bdfd97dcd-7t72x
Name: nginx-app-demo-7bdfd97dcd-7t72x
Namespace: default
Priority: 0
PriorityClassName: <none>
Node: node-3/10.254.100.103
Start Time: Sun, 11 Aug 2019 21:52:32 +0800
Labels: pod-template-hash=7bdfd97dcd #labels名称
 run=nginx-app-demo
Annotations: <none>
Status: Running
IP: 10.244.2.4 #pod的ip地址
Controlled By: ReplicaSet/nginx-app-demo-7bdfd97dcd #副本控制器为re
plicasets
Containers: #容器的信息,包括容器id,镜像,丢按扣,状态,环境变量等信息
 nginx-app-demo:
 Container ID: docker://5a0e5560583c5929e9768487cef43b045af4c6d3b7b927d9daf181cb28867766
 Image: nginx:1.7.9
 Image ID: docker-pullable://nginx@sha256:e3456c851a152494c3e4ff5fcc26f240206abac0c9d794affb40e0714846c451
 Port: 80/TCP
 Host Port: 0/TCP
 State: Running
 Started: Sun, 11 Aug 2019 21:52:40 +0800
 Ready: True
 Restart Count: 0
 Environment: <none>
 Mounts:
 /var/run/secrets/kubernetes.io/serviceaccount from default-token-txhkc (ro)
Conditions: #容器的状态条件
 Type Status
 Initialized True 
 Ready True 
 ContainersReady True 
 PodScheduled True 
Volumes: #容器卷
 default-token-txhkc:
 Type: Secret (a volume populated by a Secret)
 SecretName: default-token-txhkc
 Optional: false
QoS Class: BestEffort #QOS类型
Node-Selectors: <none> #污点类型

3、访问应用

kubernetes为每个pod都分配了一个ip地址,可通过该地址直接访问应用,相当于访问RS,但一个应用是一个整体,由多个副本数组成,需要依赖于service来实现应用的负载均衡,我们来探讨ClusterIP和NodePort的访问⽅式。

1、设置pod的内容,为了方便区分,我们将三个pod的nginx站点内容设置为不同,以观察负载均衡的效果

查看pod列表
[root@node-1 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-app-demo-7bdfd97dcd-7t72x 1/1 Running 0 28m
nginx-app-demo-7bdfd97dcd-hsrft 1/1 Running 0 28m
nginx-app-demo-7bdfd97dcd-qtbzd 1/1 Running 0 28m
进⼊pod容器中
[root@node-1 ~]# kubectl exec -it nginx-app-demo-7bdfd97dcd-7t72x /bin
/bash
设置站点内容
[root@nginx-app-demo-7bdfd97dcd-7t72x:/# echo "web1" >/usr/share/nginx
/html/index.html
以此类推设置另外两个pod的内容为web2和web3
[root@nginx-app-demo-7bdfd97dcd-hsrft:/# echo web2 >/usr/share/nginx/h
tml/index.html
[root@nginx-app-demo-7bdfd97dcd-qtbzd:/# echo web3 >/usr/share/nginx/h
tml/index.html

2、获取pod的ip地址,如何快速获取pod的ip地址呢,可以通过-o wide参数显示更多的内容,会 包含pod所属node和ip

[root@node-1 ~]# kubectl get pods -o wide 
NAME READY STATUS RESTARTS AGE I
P NODE NOMINATED NODE READINESS GATES
nginx-app-demo-7bdfd97dcd-7t72x 1/1 Running 0 34m 1
0.244.2.4 node-3 <none> <none>
nginx-app-demo-7bdfd97dcd-hsrft 1/1 Running 0 34m 1
0.244.1.2 node-2 <none> <none>
nginx-app-demo-7bdfd97dcd-qtbzd 1/1 Running 0 34m 1
0.244.1.3 node-2 <none> <none>

3、访问pod的ip,查看站点内容,不同的pod站点内容和上述步骤设置⼀致。

[root@node-1 ~]# curl http://10.244.2.4
web1
[root@node-1 ~]# curl http://10.244.1.2
web2
[root@node-1 ~]# curl http://10.244.1.3
web3

3.1 ClusterIP访问

通过pod的ip直接访问应用,对于单个pod的应用可以实现,对于多个副本replicas的应用则不符合要求,需要通过通过service来实现负载均衡,service需要设置不同的type,默认为ClusterIP即集群内部访问,如下通过expose子命令将服务暴露到service。

1、暴露service,其中port表示代理监听端口,target-port代表是容器的端口,type设置的是service的类型

[root@node-1 ~]# kubectl expose deployment nginx-app-demo --name nginx
-service-demo \
--port=80 \
--protocol=TCP \
--target-port=80 \
--type ClusterIP 
service/nginx-service-demo exposed

2、查看service的详情,可以看到service通过labels选择器selector自动将pod的ip生成endpoints

# 查看service列表,显示有两个,kubernetes为默认集群创建的service
[root@node-1 ~]# kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) 
AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 
29h
nginx-service-demo ClusterIP 10.102.1.1 <none> 80/TCP 
2m54s
#查看service详情,可以看到Labels的Seletor和前⾯Deployments设置⼀致,Endpoints将pod组成⼀个列表
[root@node-1 ~]# kubectl describe services nginx-service-demo 
Name: nginx-service-demo #名称
Namespace: default #命名空间
Labels: run=nginx-app-demo #标签名称
Annotations: <none>
Selector: run=nginx-app-demo #标签选择器
Type: ClusterIP #service类型为ClusterIP
IP: 10.102.1.1 #服务的ip,即vip,集群内部会⾃动分
配⼀个
Port: <unset> 80/TCP #服务端⼝,即ClusterIP对外访问的端
⼝
TargetPort: 80/TCP #容器端⼝
Endpoints: 10.244.1.2:80,10.244.1.3:80,10.244.2.4:80 #访问地址列
表
Session Affinity: None #负载均衡调度算法
Events: <none>

3、访问service的地址,可以访问的内容可知,service自动实现了pods的负载均衡,调度策略为轮询。因为service默认的调度策略Session Affinity为None,即是轮训,可以设置为ClientIP,实现会话保持,相同的客户端IP的请求会调度到相同的pod上。

[root@node-1 ~]# curl http://10.102.1.1
web3
[root@node-1 ~]# curl http://10.102.1.1
web1
[root@node-1 ~]# curl http://10.102.1.1
web2
[root@node-1 ~]# curl http://10.102.1.1

4、ClusterIP原理深入剖析,service后端实现有两种机制: iptables和ipvs,环境安装采用iptables,iptables通过nat的链⽣成访问规则,KUBE-SVC-R5Y5DZHD7Q6DDTFZ为⼊站 DNAT转发规则,KUBE-MARK-MASQ为出站转发

[root@node-1 ~]# iptables -t nat -L -n
Chain KUBE-SERVICES (2 references)
target prot opt source destination 
KUBE-MARK-MASQ tcp -- !10.244.0.0/16 10.102.1.1 /* 
default/nginx-service-demo: cluster IP */ tcp dpt:80
KUBE-SVC-R5Y5DZHD7Q6DDTFZ tcp -- 0.0.0.0/0 10.102.1.1 
 /* default/nginx-service-demo: cluster IP */ tcp dpt:80
出站:KUBE-MARK-MASQ源地址段不是10.244.0.0/16访问10.102.1.1的⽬标端⼝80时,将
请求转发给KUBE-MARK-MASQ链
⼊站:KUBE-SVC-R5Y5DZHD7Q6DDTFZ任意原地址访问⽬标10.102.1.1的⽬标端⼝80时将请
求转发给KUBE-SVC-R5Y5DZHD7Q6DDTFZ链

5、查看入站请求规则,入站请求规则将会映射到不同的链,不同链将会转发到不同pod的ip上。

1. 查看⼊站规则KUBE-SVC-R5Y5DZHD7Q6DDTFZ,请求将转发⾄三条链
[root@node-1 ~]# iptables -t nat -L KUBE-SVC-R5Y5DZHD7Q6DDTFZ -n
Chain KUBE-SVC-R5Y5DZHD7Q6DDTFZ (1 references)
target prot opt source destination 
KUBE-SEP-DSWLUQNR4UPH24AX all -- 0.0.0.0/0 0.0.0.0/0 
 statistic mode random probability 0.33332999982
KUBE-SEP-56SLMGHHOILJT36K all -- 0.0.0.0/0 0.0.0.0/0 
 statistic mode random probability 0.50000000000
KUBE-SEP-K6G4Z74HQYF6X7SI all -- 0.0.0.0/0 0.0.0.0/0 
2. 查看实际转发的三条链的规则,实际映射到不同的pod的ip地址上
[root@node-1 ~]# iptables -t nat -L KUBE-SEP-DSWLUQNR4UPH24AX -n
Chain KUBE-SEP-DSWLUQNR4UPH24AX (1 references)
target prot opt source destination 
KUBE-MARK-MASQ all -- 10.244.1.2 0.0.0.0/0 
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp to:1
0.244.1.2:80
[root@node-1 ~]# iptables -t nat -L KUBE-SEP-56SLMGHHOILJT36K -n
Chain KUBE-SEP-56SLMGHHOILJT36K (1 references)
target prot opt source destination 
KUBE-MARK-MASQ all -- 10.244.1.3 0.0.0.0/0 
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp to:1
0.244.1.3:80
[root@node-1 ~]# iptables -t nat -L KUBE-SEP-K6G4Z74HQYF6X7SI -n
Chain KUBE-SEP-K6G4Z74HQYF6X7SI (1 references)
target prot opt source destination 
KUBE-MARK-MASQ all -- 10.244.2.4 0.0.0.0/0 
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp to:1
0.244.2.4:80

3.2 NodePort访问

Service通过ClusterIP只能提供集群内部的应用访问,外部无法直接访问应用,如果需要外部访问有如下几种方式:NodePort,LoadBalancer和Ingress,其中LoadBalancer需要由云服务 提供商实现,Ingress需要安装单独的Ingress Controller,⽇常测试可以通过NodePort的⽅式 实现,NodePort可以将node的某个端⼝暴露给外部⽹络访问。

 1、修改type的类型由ClusterIP修改为NodePort类型(或者重新创建,指定type的类型为 NodePort)

1. 通过patch修改type的类型
[root@node-1 ~]# kubectl patch services nginx-service-demo -p '{"spec"
:{"type": "NodePort"}}'
service/nginx-service-demo patched
2. 确认yaml⽂件配置,分配了⼀个NodePort端⼝,即每个node上都会监听该端⼝
[root@node-1 ~]# kubectl get services nginx-service-demo -o yaml
apiVersion: v1
kind: Service
metadata:
 creationTimestamp: "2019-08-11T14:35:59Z"
 labels:
 run: nginx-app-demo
 name: nginx-service-demo
 namespace: default
 resourceVersion: "157676"
 selfLink: /api/v1/namespaces/default/services/nginx-service-demo
 uid: 55e29b78-bc45-11e9-b073-525400490421
spec:
 clusterIP: 10.102.1.1
 externalTrafficPolicy: Cluster
 ports:
 - nodePort: 32416 #⾃动分配了⼀个NodePort端⼝
 port: 80
 protocol: TCP
 targetPort: 80
 selector:
 run: nginx-app-demo
 sessionAffinity: None
 type: NodePort #类型修改为NodePort
status:
 loadBalancer: {}
 
3. 查看service列表,可以知道service的type已经修改为NodePort,同时还保留Cluster
IP的访问IP
[root@node-1 ~]# kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) 
 AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 
 30h
nginx-service-demo NodePort 10.102.1.1 <none> 80:32416/T
CP 68m

2、通过NodePort访问应⽤程序,每个node的地址相当于vip,可以实现相同的负载均衡效果, 同时CluserIP功能依可⽤

1. NodePort的负载均衡
[root@node-1 ~]# curl http://node-1:32416
web1
[root@node-1 ~]# curl http://node-2:32416
web1
[root@node-1 ~]# curl http://node-3:32416
web1
[root@node-1 ~]# curl http://node-3:32416
web3
[root@node-1 ~]# curl http://node-3:32416
web2
2. ClusterIP的负载均衡
[root@node-1 ~]# curl http://10.102.1.1
web2
[root@node-1 ~]# curl http://10.102.1.1
web1
[root@node-1 ~]# curl http://10.102.1.1
web1
[root@node-1 ~]# curl http://10.102.1.1
web3

3、NodePort转发原理,每个node上通过kube-proxy监听NodePort的端⼝,由后端的iptables 实现端⼝的转发

1. NodePort监听端⼝
[root@node-1 ~]# netstat -antupl |grep 32416
tcp6 0 0 :::32416 :::* LI
STEN 32052/kube-proxy 
2. 查看nat表的转发规则,有两条规则KUBE-MARK-MASQ出⼝和KUBE-SVC-R5Y5DZHD7Q6DD
TFZ⼊站⽅向。
Chain KUBE-NODEPORTS (1 references)
target prot opt source destination 
KUBE-MARK-MASQ tcp -- 0.0.0.0/0 0.0.0.0/0 /* 
default/nginx-service-demo: */ tcp dpt:32416
KUBE-SVC-R5Y5DZHD7Q6DDTFZ tcp -- 0.0.0.0/0 0.0.0.0/0 
 /* default/nginx-service-demo: */ tcp dpt:32416
3. 查看⼊站的请求规则链KUBE-SVC-R5Y5DZHD7Q6DDTFZ 
[root@node-1 ~]# iptables -t nat -L KUBE-SVC-R5Y5DZHD7Q6DDTFZ -n
Chain KUBE-SVC-R5Y5DZHD7Q6DDTFZ (2 references)
target prot opt source destination 
KUBE-SEP-DSWLUQNR4UPH24AX all -- 0.0.0.0/0 0.0.0.0/0 
 statistic mode random probability 0.33332999982
KUBE-SEP-56SLMGHHOILJT36K all -- 0.0.0.0/0 0.0.0.0/0 
 statistic mode random probability 0.50000000000
KUBE-SEP-K6G4Z74HQYF6X7SI all -- 0.0.0.0/0 0.0.0.0/0 
 
4. 继续查看转发链,包含有DNAT转发和KUBE-MARK-MASQ和出站返回的规则
[root@node-1 ~]# iptables -t nat -L KUBE-SEP-DSWLUQNR4UPH24AX -n
Chain KUBE-SEP-DSWLUQNR4UPH24AX (1 references)
target prot opt source destination 
KUBE-MARK-MASQ all -- 10.244.1.2 0.0.0.0/0 
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp to:1
0.244.1.2:80
[root@node-1 ~]# iptables -t nat -L KUBE-SEP-56SLMGHHOILJT36K -n
Chain KUBE-SEP-56SLMGHHOILJT36K (1 references)
target prot opt source destination 
KUBE-MARK-MASQ all -- 10.244.1.3 0.0.0.0/0 
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp to:1
0.244.1.3:80
[root@node-1 ~]# iptables -t nat -L KUBE-SEP-K6G4Z74HQYF6X7SI -n
Chain KUBE-SEP-K6G4Z74HQYF6X7SI (1 references)
target prot opt source destination 
KUBE-MARK-MASQ all -- 10.244.2.4 0.0.0.0/0 
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp to:1
0.244.2.4:80

4. 扩展应用

当应⽤程序的负载⽐较⾼⽆法满⾜应⽤请求时,⼀般我们会通过扩展RS的数量来实现,在 kubernetes中,扩展RS实际上通过扩展副本数replicas来实现,扩展RS⾮常便利,快速实现 弹性伸缩。kubernets能提供两种⽅式的伸缩能⼒:1. ⼿动伸缩能⼒scale up和scale down,2. 动态的弹性伸缩horizontalpodautoscalers,基于CPU的利⽤率实现⾃动的弹性伸缩,需要依赖 与监控组件如metrics server,当前未实现,后续再做深⼊探讨,本⽂以⼿动的scale的⽅式扩 展应⽤的副本数。

 1、⼿动扩展副本数

[root@node-1 ~]# kubectl scale --replicas=4 deployment nginx-app-demo
deployment.extensions/nginx-app-demo scaled

2、查看副本扩展情况,deployments自动部署一个应用

[root@node-1 ~]# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-app-demo 4/4 4 4 133m

3、此时service的情况会怎样呢?查看service详情,新扩展的pod会⾃动更新到service的 4. 扩展应⽤ endpoints中,⾃动服务发现

查看service详情
[root@node-1 ~]# kubectl describe services nginx-service-demo 
Name: nginx-service-demo
Namespace: default
Labels: run=nginx-app-demo
Annotations: <none>
Selector: run=nginx-app-demo
Type: NodePort
IP: 10.102.1.1
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 32416/TCP
Endpoints: 10.244.1.2:80,10.244.1.3:80,10.244.2.4:80 + 
1 more...#地址已⾃动加⼊
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
查看endpioints详情
[root@node-1 ~]# kubectl describe endpoints nginx-service-demo 
Name: nginx-service-demo
Namespace: default
Labels: run=nginx-app-demo
Annotations: endpoints.kubernetes.io/last-change-trigger-time: 2019-0
8-11T16:04:56Z
Subsets:
 Addresses: 10.244.1.2,10.244.1.3,10.244.2.4,10.244.2.5
 NotReadyAddresses: <none>
 Ports:
 Name Port Protocol
 ---- ---- --------
 <unset> 80 TCP
Events: <none>

4、测试,将新加入pod站点内容设置为web4,参考前⾯的设置⽅法,测试service的ip,查 看负载均衡效果

[root@node-1 ~]# curl http://10.102.1.1
web4
[root@node-1 ~]# curl http://10.102.1.1
web4
[root@node-1 ~]# curl http://10.102.1.1
web2
[root@node-1 ~]# curl http://10.102.1.1
web3
[root@node-1 ~]# curl http://10.102.1.1
web1
[root@node-1 ~]# curl http://10.102.1.1
web2
[root@node-1 ~]# curl http://10.102.1.1
web1

由此可知,弹性伸缩会⾃动⾃动加⼊到service中实现服务⾃动发现和负载均衡,应⽤的扩展 相⽐于传统应⽤快速⾮常多。此外,kubernetes还⽀持⾃动弹性扩展的能⼒,即Horizontal Pod AutoScaler,⾃动横向伸缩能⼒,配合监控系统根据CPU的利⽤率弹性扩展Pod个数。

参考文档

基础概念:https://kubernetes.io/docs/tutorials/kubernetes-basics/

部署应⽤:https://kubernetes.io/docs/tutorials/kubernetes-basics/deploy-app/deploy-intro/

访问应⽤:https://kubernetes.io/docs/tutorials/kubernetes-basics/explore/explore-intro/

外部访问:https://kubernetes.io/docs/tutorials/kubernetes-basics/expose/expose-intro/

访问应⽤:https://kubernetes.io/docs/tutorials/kubernetes-basics/scale/scale-intro/

滚动升级:https://kubernetes.io/docs/tutorials/kubernetes-basics/update/update-intro

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kubernetes快速入门 的相关文章

随机推荐