Kubernetes学习(001~010)
001
#创建一个单节点的k8s集群
minikube start
kubectl get nodes
kubectl cluster-info
#部署应用
kubectl run kubernetes-bootcamp
–image=docker.io/jocatalin/kubernetes-bootcamp:v1
–port=8080
#Pod是容器的集合,k8s调度的最小单位
kubectl get pods
#为了能够从外部访问应用,将容器的8080端口映射到节点的端口
kubectl expose deployment/kubernetes-bootcamp
–type=“NodePort”
–port 8080
#查看节点被映射到host01的32320端口
kubectl get services
curl host01:32320
#Scale应用
#查看副本数
kubectl get deployments
#将副本数量增加到3个
kubectl scale deployments/kubernetes-bootcamp --replicas=3
#当前pod也增加到3个
kubectl get pods
#访问应用,每次请求发送到不同的Pod,三个副本轮询处理,实现了负载均衡
curl host01:32320
↓
↓
kubectl scale deployments/kubernetes-bootcamp --replicas=2
#其中一个副本被删除了
kubectl get pods
#滚动更新
kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
kubectl get pods
#回退
kubectl rollout undo deployments/kubernetes-bootcamp
curl host01:32320
【重要概念】
Cluster:计算、存储和网络资源的集合,k8s利用这些资源运行各种基于容器的应用。
Master:Cluster的大脑,负责调度,即决定将应用放在哪里运行。
Node:负责运行容器应用。由Master管理,Node负责监控并汇报容器的状态,并根据Master的要求管理容器的生命周期。
Pod:k8s最小工作单元。每个Pod包含一个或多个容器。Pod中的容器会作为一个整体被Master调度到一个Node上运行。
(Pod中的所有容器使用同一个网络namespace,即相同的IP地址和Port空间。它们可以直接用localhost通信。)
(同样的,这些容器可以共享存储,当k8s挂载volume到Pod,本质上是将volume挂载到Pod中的每一个容器)
↓
↓
Controller:k8s通过Controller来管理Pod,Controller中定义了Pod的部署特性。k8s提供了多种Controller:Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job 等
Deployment:最常用,可以管理Pod的多个副本,并确保Pod按照期望的状态运行。
ReplicaSet:实现了Pod的多副本管理。Deployment是通过ReplicaSet来管理Pod的多个副本。
DaemonSet:用于每个Node最多只运行一个Pod副本的场景。
StatefuleSet:保证Pod的每个副本在整个生命周期中名称是不变的。
Job:用于运行结束就删除的应用。
↓
↓
Service:定义了外界访问一组特定Pod的方式。Service有自己的IP和端口,Service为Pod提供了负载均衡。
Kubernetes运行容器(Pod)与访问容器(Pod)这两项任务分别由Controller和Service执行。
↓
↓
namespace可以将一个物理的Cluster逻辑上划分成多个虚拟Cluster,每个Cluster就是一个namespace。
不同namespace里的资源是完全隔离的。
kubectl get namespace
kubectl get pod --all-namespaces
003、Kubernetes架构
a、Master节点
kube-apiserver
kube-scheduler
kube-controller-manager(负责管理Cluster各种资源,保证资源处于预期的状态)
etcd(保存cluster的配置信息和各种资源的状态信息)
Pod网络
b、Node节点
是Pod运行的地方,k8s支持Docker、rkt等容器Runtime。
kubelet(是Node的agent)
kube-proxy(负责将访问Service的TCP/UDP数据量转发到后端的容器。如果有多个副本,会实现负载均衡)
Pod网络
注意:k8s-master上也有 kubelet 和 kube-proxy。
#系统组件都放在kube-system namespace中
kubectl get pod --all-namespaces -o wide
004、通过例子理解k8s架构
kubectl run http-app --image=httpd --replicas=2
kubectl get deployment
kubectl get pod -o wide
(部署了deployment httpd-app,有两个副本Pod,分别运行在k8s-node1和k8s-node2)
↓
↓
过程:
a、kubectl发送部署请求到API Server
b、API Server通知Controller Manager创建一个deployment资源
c、Scheduler执行调度任务,将两个副本Pod分发到k8s-node1和k8s-node2
d、k8s-node1和k8s-node2上的kubectl在各自的节点上创建并运行Pod
005、用Deployment运行应用
k8s通过各种Controller来管理Pod的生命周期。
↓
↓
kubectl run nginx-deployment --image=nginx:1.7.9 --replicas=2
kubectl get deployment nginx-deployment
kubectl describe deployment nginx-deployment(重点看最下面,告诉我们创建了一个ReplicaSet,Events是Deployment的日志,记录了ReplicaSet的启动过程)
kubectl get replicaset
kubectl describe replicaset nginx-deployment-12688880958(Controlled By指明由nginx-deployment创建,Events记录了两个副本Pod的创建)
kubectl get pod
kubectl describe pod nginx-deployment-12688880958-kn8w3
↓
↓
总结:
a、用户通过kubectl创建Deployment
b、Deployment创建ReplicaSet
c、ReplicaSet创建Pod
006、k8s创建资源的两种方式
两种方式:
a、用kubectl命令直接创建
b、通过配置文件和kubectl apply创建(kubectl apply -f nginx.yaml)
007、读懂Deployment YAML
apiVersion是当前配置格式的版本。
kind是要创建的资源类型
metadata是该资源的元数据
spec部分是该Deployment的规格说明
replicas指明副本数量
template定义Pod的模板
metadata定义Pod的元数据,至少要定义一个label
spec描述Pod的规格,此部分定义Pod中每一个容器的属性
kubectl apply -f nginx.yml
kubectl get deployment
kubeclt get replicaset
kubectl get pod -o wide
↓
↓
#删除资源的两种方式
kubectl delete deployment nginx-deployment
kubectl delete -f nginx.yml
008、如何Scale Up/Down
修改nginx.yml,将副本改成5个。
kubectl apply -f nginx.yml
kubectl get pod -o wide
009、k8s如何Failover?
模拟k8s-node2故障,关闭该节点。
k8s会检查到k8s-node2不可用,将k8s-node2上的Pod标记为Unknown状态,并在k8s-node1上新创建两个Pod,维持总副本数为3。
当 k8s-node2 恢复后,Unknown 的 Pod 会被删除,不过已经运行的 Pod 不会重新调度回 k8s-node2。
010、用label控制Pod的位置
如何希望将Pod部署到指定的Node。
通过label来实现这个功能。
各种资源都可以设置label。
↓
↓
#标注 k8s-node1 是配置了 SSD 的节点
kubectl label node k8s-node1 disktype=ssd
#查看节点的label
kubectl get node --show-labels
#将Pod部署到k8s-node1
kubectl apply -f nginx.yml
#如果要删除label disktype
kubectl label node k8s-node1 disktype–