欢迎访问我的博客,你的支持,是我最大的动力!

马哥_K8s进阶实战(1)基础/资源管理基础

Docker 小马奔腾 1338℃ 评论
目录:
[显示]

《kubernetes进阶实战》一书配套YAML源码  https://github.com/iKubernetes/Kubernetes_Advanced_Practical

Kubernetes系统基础

资源抽象

1、Pod
为最小调度单元,同一Pod中容器共享网络名称空间和存储资源,由回环节口lo直接通信

2、资源标签
Label是将资源进行分类的标识符,是key/values数据,为指定对象提供辨识性属性

3、标签选择器
Selector根据Label来过滤符合条件的资源对象,使用标签对资源对象进行分类,使用标签选择器挑选出它们

4、Pod管制器
通常不直接部署及管理Pod,而是借助控制器Controller进行管理
包括 ReplicationController、ReplicaSet、Deployment、StatefulSet、Job等

5、服务资源Service
Service是Pod上的资源抽像,将标签选择器选定的一组Pod定义统一固定访问入口(IP及DNS名称),到达Service的请求将负载均衡到后端的各Pod
Service也可将集群外部流量引入到集群中

6、存储卷
Volume分为临时卷、本地卷和网络卷,临时卷和本地卷位于Node本地,常用于数据缓存

7、Name和Namespace
同一Navespace下同一类型资源对象的Name必须唯一,逻辑分组,默认名称空间是default

8、注解Annotation
附加在对象上的键值类型数据,拥有更大的数据容量,不能用于标识和选择对象,主要用于方便工具或用户阅读和查找

9、Ingress
开放给外部访问

集群组件

Master 组件:

1、API Server
RESTful风格的API,接收、校验和响应所有REST请求,结果状态持久存储于etcd中,API Server是整个集群的网关

2、集群状态存储 Cluster State Store
生产环境中etcd应以集群方式运行以确保服务可用性
etcd除提供键值存储,还提供监听watch机制,监听和推送变更,键值发生变化时会通知到API Server,并由watch API向客户端输出

3、控制管理器 Controller Manager
集群级别大多数功能都是由控制器执行实现的,如生命周期功能和API业务逻辑
生命周期功能:Namespace创建和生命周期、Event垃圾回收、Pod终止相关的垃圾回收、级联垃圾回收、Node垃圾回收
API业务逻辑:如由ReplicaSet执行的Pod扩展等

4、调度器 Scheduler
API Server确认Pod对象创建请求后,需由Scheduler根据各节点可用资源状态及需运行容器资源需求做出调度决策

Node 组件:

1、核心代理程序kubelet
工作结点上的守护进程,从API Server接收关于Pod对象的配置信息并确保其处于期望的状态
kubelet在API Server上注册当前工作节点,定期汇报节点资源使用情况,并通过cAdvisor监控容器和节点资源占用状况

2、容器运行时环境
下载镜像并运行容器,支持Docker、RKT、cri-o、Fraki等

3、kube-proxy
守护进程,按需为Service生成iptables或ipvs规则,捕获访问当前Service的ClusterIP流量并转发至正确的后端Pod对象

核心附件 add-ons :

1、KubeDNS:默认为CoreDNS

2、Kubernetes Dashboard:Web UI

3、Heapster:容器和节点的性能监控与分析系统,新版由Prometheus结合其他组件取代

4、Ingress Controller:有Nginx、Traefik、Envoy、HAProxy等

网络模型:

Pod内容器通信 <-> Pod间通信 <-> Pod和Service通信 <-> 集群外部流量和Service通信

要求,所有Pod对象都位于同一平面网络中(不经NAT),且可使用Pod自身地址直接通信

Pod IP:由网络插件负责管理和配置,实际存在于某个网卡,可为虚拟网卡
Cluster IP:由集群负责配置和管理,即Service的IP,是虚拟IP地址,不存在于任何网络接口上,由kube-proxy借助iptables或ipvs重定向到本地端口,再调度至后端Pod对象

节点网络:真实网络,先于集群配置,集群不能管理
Pod网络:虚拟网络,配置于Pod中容器网络接口上,借助插件实现,插件可独立部署于集群外或托管于集群上
Service网络:虚拟网络,在集群创建时予以指定,各Service地址在创建时动态配置

Kubernetes快速入门

Pod资源对象

K8s要求各Pod对象IP地址位于同一网络平面内,即同一个IP地址段,各Pod间可使用IP直接进行通信
Pod内容器共享网络(包括主机名、IP、端口)和存储卷
Pod的创建和定义由控制器对象实现
创建Pod时,可使用Pod Preset对象为Pod注入特定信息,如ConfigMap、Secret、存储卷、环境变量等

Controller

节点资源耗尽或故障会导致Pod对象被回收
控制器是资源类型,包括:Replication Controller、Deployment、StatefulSet、DaemonSet、Jobs等,统称为Pod控制器
Pod控制器由期望的副本数量、Pod模板、标签选择器组成
通常需手动调整Pod副本数量,若部署有HeapSter或Prometheus等资源指标监控附件时,可使用HorizontalPodAutoscaler (HPA) 计算合适副本数量,实现动态伸缩

Service

Service IP也称为Cluster IP,集群内Pod对象可直接请求此类Cluster IP
Service三种常用类型:
1、ClusterIP类型,仅用于集群内部通信
2、NodePort类型,接入集群外部请求,工作于每个节点的主机IP之上
3、LoadBalancer类型,将外部请求负载均衡至多个Node的主机IP的NodePort上,LoadBalancer是集群外部组件,不受K8s管理

Kubernetes集群部署

kubeadm是K8s集群全生命周期的管理工具,可实现集群部署、升级/降级、拆除
kubeadm仅关心初始化并启动集群,安装Dashboard、监控系统、日志系统等附加组件需自行部署
使用kubeadm部署的集群会强制启用RBAC、采用安全通信
kubeadm init 集群初始化,部署master节点各组件
kubeadm join 将节点加入集群
kubeadm token 管理认证令牌
kubeadm reset 删除构建中生成的文件并重置回初始状态
kubeadm config print-default
kubeadm config migrate
kubeadm config images pull
kubeadm upgrade node config

集群运行模式

独立组件:各组件直接以守护进程方式运行于名节点
静态Pod模式:除kubelet外其他组件以静态Pod运行于Master主机上
自托管:类似于静态Pod,但受控于DaemonSet控制器,非静态Pod对象
使用kubeadm部署的集群默认为静态Pod模式,使用--features-gates=selfHosting可部署为自托管式

kubectl version --short  # 查看版本信息
kubectl cluster-info  # 查看集群信息

kubectl 命令示例
1、创建资源对象
# 通过选项创建
kubectl run nginx-deploy --image=nginx:1.12 --replicas=2  # 创建Deployment类型控制器
kubectl get deployments.apps
kubectl get pod --output=wide
kubectl expose deployment/nginx-deploy --name=nginx-svc --port=80  # 创建服务
kubectl get svc
# 通过资源清单
kubectl create -f nginx-deploy.yaml -f nginx-svc.yaml
# 声明式对象配置
kubectl apply -f nginx-deploy.yaml -f nginx-svc.yaml
2、查看资源对象
kubectl get namespaces
kubectl get pods,service -o wide  # 查看两类资源对象并输入额外信息
kubectl get pods -l run -n default  # -l 标签名称为run
3、获取资源详细信息
kubectl get pods -l component=kube-apiserver -o yaml -n kube-system  # 标签为component=kube-apiserver 输出yaml格式 支持json格式
kubectl describe pods -l component=kube-apiserver -n kube-system
## 也支持 type name 或type/name 形式,如 pods nginx  ; pods/nginx
4、查看容器日志信息
kubectl logs [-f] [-p] (pod|type/name) [-c container] [options]  # 若pod对象内仅一个容器,-c选项可省略
kubectl logs kube-apiserver-kube-master -n kube-system
5、在容器中执行命令
kubectl exec kube-apiserver-kube-master -n kube-system -- date
kubectl exec kube-apiserver-kube-master -n kube-system -- find / -name date
# 进入容器交互式Shell接口
kubectl exec -it kube-apiserver-kube-master -n kube-system -- /bin/sh
6、删除资源对象
# 对受控于控制器的对象 删除后会被控制器重建
kubectl delete services nginx-svc
kubectl delete pods -l run=nginx-deploy  # 容器删除后会被deployments重建
kubectl delete TYPE --all -n NS  # 删除某命名空间内所有Pod

应用基础管理流程:
1、使用合适的Controller创建并管控Pod对象
2、为Pod对象创建Service对象,以便提供固定IP,并借助CoreDNS进行服务发现
3、随时查看各资源信息,了解运行状态
4、手动扩缩容或通过HPA自动伸缩
5、滚动更新、回滚

命令式容器应用编排

kubectl run 使用Deployment控制器创建Pod对象
参数:
-l,--labels 为Pod设定自定义标签
--record 保存创建命令至对象Annotation中,true/false
--save-config 保存配置信息到Annotation中,true/false
--restart=Never 创建不受控制器管控的自主式Pod对象

kubectl run myapp --image=ikubernetes/myapp:v1 --port=80 --replicas=1 --dry-run  # --dry-run 命令的测试运行不执行对象创建过程

kubectl get pods -o name -n kube-system  # 仅输出容器名称

创建Service

个个Service对象可视作通过标签选择器过滤出的一组Pod对象,并能为该组Pod对象监听的套接字提供端口代理及调度服务

kubectl expose deployments/myapp --type=NodePort --port=80 --name=myapp
# 映射Pod80端口到NodePort(端口号随机分配) 访问时要使用ip 不能用localhost或127.0.0.1 如curl 192.168.1.120:30493
# 访问时亦可使用域名  docker exec -it f0 curl myapp 或者 myapp.default 或者myapp.default.svc.cluster.local
# 全称解析服务在对象创建后即可使用

创建Service的另一种方式是 kubectl create service clusterip|nodeport 等

kubectl describe services myapp
结果中:
Session Affinity: None  是否启用会话粘性
External Traffic Policy: Cluster  外部流量的调度策略

扩缩容

kubectl scale deployment/myapp --replicas=3
kubectl get pods -l ma=dong   #查看pod
kubectl describe deployments.apps myapp  #在Events中 可以看到扩容的记录
kubectl describe svc myapp  # Endpoints也相应的增加了节点
## curl 10.109.250.186/hostname.html  可以看到 负载被分配到不同的后端pod
## wget -O - -q http://10.109.250.186/hostname.html

修改及删除对象

# 获取对象的完整配置信息
kubectl get deployments.apps myapp -o yaml

# 修改配置
kubectl edit svc myapp
## 修改会立即生效 若对不支持修改的属性进行了修改 编辑器将不允许保存退出

# 删除
kubectl delete service myapp
kubectl delete deployment myapp --cascade=false  # 仅删除控制器而不删除pod
kubectl delete deployment --all   # 删除所有deployment对象

资源管理基础

Kubernetes 资源对象

Kubernetes的API对象可分为五个类别:
工作负载:workload、发现和负载均衡discovery&LB、配置和存储config&storage、集群cluster、元数据metadata

API群组

kubectl api-versions
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
apps/v1
apps/v1beta1
apps/v1beta2
authentication.k8s.io/v1
authentication.k8s.io/v1beta1
authorization.k8s.io/v1
authorization.k8s.io/v1beta1
autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2
batch/v1
batch/v1beta1
certificates.k8s.io/v1beta1
coordination.k8s.io/v1beta1
events.k8s.io/v1beta1
extensions/v1beta1
networking.k8s.io/v1
policy/v1beta1
rbac.authorization.k8s.io/v1
rbac.authorization.k8s.io/v1beta1
scheduling.k8s.io/v1beta1
storage.k8s.io/v1
storage.k8s.io/v1beta1
v1

api群组的根为 /apis
核心群组有专用简化路径 /api/v1  apiVersion: v1
命名群组 /apis/$GROUP_NAME/$VERSION apiVersion: apps/v1

名称空间级别的url抽象
/apis/<group>/<version>/namespaces/<namespace>/<kind-plural>

kubectl get deployments.apps
kubectl get --raw /apis/apps/v1/namespaces/default/deployments/myapp | jq .
# 查看指标数据 prometheus格式
kubectl get --raw=/api/v1/nodes/kube-master/proxy/metrics/cadvisor | more

延伸:通过Promethues查询k8s集群中Pod的cpu/内存等指标

访问Kubernetes REST API

API Server默认是HTTPS方式,且需要进行一系列认证检查,可以通过kubectl proxy在本地主机为API Server启动一个代理网关,从而使用http方式进行访问

kubectl proxy --port=8080    # 启用本地代理
curl localhost:8080/api/v1/namespaces/    #请求NamespaceList资源对象 类似于kubectl get namespaces
curl localhost:8080/api/v1/namespaces/ | jq .items[].metadata.name    #仅过滤出namespace名称
curl -s localhost:8080/api/v1/namespaces/default  #查看default的信息

对象类资源格式

kind:  标识对象所属资源类型
apiVersion: API群组及相关版本
metadata: 元数据信息,名称、标签、namespace等
spec: 期望的状态
status: 活动对象当前状态信息,由系统维护,只读字段

kubectl get namespaces kube-system -o yaml
kubectl get namespaces kube-system -o json

metadata 嵌套字段
描述对象的属性信息,定义资源元数据
必要字段:
namespace,name
uid 唯一标识符,区别拥有同样名字的 已删除 和 重新创建 的同名对象
可选字段:
labels,annotations、creationTimestamp、deletionTimestamp
resourceVersion 内部版本标识符,用于让客户端确定对象是否变动
generation 当前对象目标状态的代别

kubectl explain 可获取相关使用帮助
kubectl explain pods
kubectl explain pods.spec
kubectl explain pods.spec.dnsConfig.options   #查看不同级别的字段和说明 Object类型的就有下一级

以现有对象生成配置清单模板
kubectl get deployments.apps myapp -o yaml --export > deploy-demo.yaml
# --export会忽略掉有系统生成的信息

kubectl命令:
陈述式命令 run expose delete get
陈述式对象配置
声明式对象配置 apply

kube-applier 项目,自动化声明式配置,配置推送到git仓库,自动同步于集群中
kubetop 项目,python,快速查看负载情况,不好用

kubectl 命令

多个 yaml 文件合并成一个文件时,需要使用"---"作为单独的行进行分割
-f 可为yaml文件或URL  可使用多次 -R 可递归获取子目录中的配置清单文件

apply会比较资源在清单文件中的版本及前一次的版本执行更新操作 不会对未定义的属性产生额外作用
为利用apply命令优势,应该总是使用apply命令或 create --save-config命令创建资源

输出格式:

通用选项:
-s --server 指定API Server的地址和端口
--kubeconfig 指定kubeconfig文件路径 默认为~/.kube/config
--namespace 指定命名空间

Namespace

名称空间不能实现pod间通信的隔离,仅用于限制资源对象名称的作用域

kubectl get namespaces  #kubectl get namespace
kubectl describe namespaces default   # 查看详细信息
kubectl get pods -n kube-system
# 创建
kubectl create namespace qa
# 删除
kubectl delete namespaces qa

删除namespace会级联删除其包含的所有其他资源对象

Pod

陈述式对象配置管理方式
常命令有 create delete replace get describe

kubectl create -f pod-example.yaml
--record 记录命令
--save-config 保存配置信息,接近 apply 声明式对象配置
kubectl get -f pod-example.yaml # 查看
kubectl get -f pod-example.yaml -o custom-columns=NAME:metadata.name,STATUS:status.phase # 自定义输出
kubectl describe -f pod-example.yaml # 查看详情
# 更新
kubectl get pods pod-example -o yaml >pod-example-update.yaml
kubectl replace -f pod-example-update.yaml  #修改镜像 ikubernetes/myapp:v2
或者 kubectl replace -f pod-example.yaml --force  #直接在pod-example.yaml中修改
# 删除
kubectl delete -f pod-example.yaml

声明式对象配置管理方式
常用命令 apply patch
比较前后配置差异 而后作变更

kubectl apply -f pod-example.yaml
# 删除
kubectl apply -f <directory/> --prune -l <labels>
注意 该操作异常凶险,它基于标签过滤出符合条件的对象 再检查指定目录中是否在某配置文件中已定义了相应的资源 并删除不存在相应定义的资源对象
所以建议使用陈述式对象配置方式 kubectl delete删除资源

 

 

转载请注明:轻风博客 » 马哥_K8s进阶实战(1)基础/资源管理基础

喜欢 (5)or分享 (0)