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

马哥_K8s进阶实战(1)

Docker 马从东 19℃ 评论
目录:
[显示]

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对象

资源管理基础

 

 

 

 

 

 

转载请注明:轻风博客 » 马哥_K8s进阶实战(1)

喜欢 (0)or分享 (0)