Kubernetes

1.Kubernetes介绍

    主要为自动化部署扩展和管理容器应用,提供了资源调度部署管理服务发现扩容缩容监控等一整套功能。(开源的容器集群管理系统,go语言,也叫k8s)

    用途自动化容器的部署和复制;随着扩展或收缩容量规模将容器组织成组,并且提供容器间的负载均衡;很容易地升级应用程序容器的新版本提供容器弹性 容器失效就替代它

 (优势:容器编排、轻量级、开源、弹性伸缩、负载均衡)

 

2.K8s主要功能

    数据卷:pod中容器间数据共享,可使用数据卷

    应用程序健康检查:容器内服务可能进程堵塞无法处理请求,可设置监控检查策略保证应用健壮性

    复制应用程序实例:控制器维护pod副本数量保证一pod或一组同类pod始终可用

    弹性伸缩:根据设定的指标(CPU利用率)自动缩放pod副本数

    服务发现:使用环境变量或DNS服务插件保证容器中程序发现pod入口访问地址

    负载均衡:一组pod副本分配一个私有的集群IP地址,负载均衡转发请求到后端容器。在集群内部其他pod可通过这个cluster IP访问应用

    滚动更新:更新服务不中断,一次更新一个pod,而不是同时删除整个服务

    服务编排:通过文件描述部署服务,使得应用程序部署变得更高效

    资源监控:Node节点组件集成cadvisor资源收集工具,可通过heapster汇总整个集群节点资源数据,然后存储到influxdb时序数据库,再由grafana展示

    提供认证和授权:支持角色访问(RBAC)认证授权等策略

 

3.基本对象概念

   Pod最小部署单元、一组容器的集合、一个Pod中的容器共享网络命名空间(短暂的)

   Controllers更高级层次对象,部署和管理Pod

       ReplicaSet : 确保预期的Pod副本数量     Deployment : 无状态应用部署

       StatefulSet : 有状态应用部署     DaemonSet : 确保所有Node运行同一个Pod

       Job : 一次性任务               Cronjob : 定时任务

   Service防止Pod失联、定义一组Pod的访问策略

   Label:标签,附加到某个资源上,用于关联对象、查询和筛选

   Namespaces命名空间,将对象逻辑上隔离

   Annotations注释

 

4.系统架构及组件功能

   master组件:(不跑任务)

   Apiserver集群统一入口,所有对象资源的增删改查和监听操作都交给APIserver处理后在提交给etcd存储

   Controller-manager集群中常规后台任务处理,一个资源对应一控制器,管理控制器

   Scheduler根据调度算法为新创建的pod选择一个node节点

   Etcd键值对数据库,保存集群中重要信息(持久化),如:pod/service等对象信息

   node组件:(工作节点)

   Kebeletmaster在node节点的agent,管理本机运行容器的生命周期,如:创建容器、pod挂载数据卷。

   Kube-proxynode节点上实现pod网络代理,维护网络规则和四层负载均衡工作

   Docker/rocket/rkt容器引擎,运行容器

 

   coreDNS可以为集群中SVC创建一个域名/IP的对应关系解析

   Dashboard给k8s集群提供一个B/S结构访问体系

   Ingress controller:官方只能实现四层代码,ingresss可实现7层代理

   Promethedus提供k8s集群监控

   ELKK8s集群日志统一分析平台

 

5.K8S集群部署

   (1)minikube方式安装:需要先安装docker,kubectl get node //查看节点信息

   (2)云平台搭建

   (3)裸机搭建 

       主节点安装:docker/kubectl(集群命令行交互工具)/kubeadm(集群初始化工具)

       worker节点安装:docker/kubelet(管理pod和容器)/kube-proxy(网络代理,负责网络相关工作)

    kubenetes安装:(1 master + 2 node节点 centos7系统)   //master不会跑任务

    (1)设置主机名解析:3台主机配置 /etc/hosts  

    (2)关闭selinux和关闭防火墙

    (3)添加k8s安装源(3台)+docker安装源(3台)

    (4)安装所需组件:yum -y install kublet kubadm kubectl docker-ce(3台)并启动kubelet/docker

    (5)修改docker配置/etc/docker

    (6)主节点:

       kubeadm初始化集群:kubeadm init --image-repository=registry.aliyuncs.com/google_containers

       复制授权文件,以便 kubectl 可以有权限访问集群

    (7)工作节点:

       工作节点加入集群:kubeadm join 172.16.32.10:6443 --token xxx --discovery-token-ca-cert-hash xxx

    (8)主节点

       安装网络插件,否则 node 是 NotReady 状态(主节点跑)

    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

    kubectl get node      查看

    //集群安装完成

    部署应用到集群中   ***yaml转json:https://tools.fun/json2yaml.html

     命令行创建:kubectl run testapp --image=ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1

     yaml创建:kubectl apply -f pod.yaml

    (Deployment管理  //kubectl get deployment )

      kubectl get pod -o wide   //查看pod运行的IP,在哪个节点运行

     Deployment通过 label 关联起来 Pods

 

6.kubectl管理工具

    设置集群项中名为kubernetes的apiserver地址与根证书:

    kubectl config set-cluster kubernetes --server=https://192.168.1.195:6443 --certificate-authority=ca.pem

    设置用户项中cluster-admin用户证书认证字段:

    kubectl config set-credentials cluster-admin --certificate-authority=ca.pem --client-key=admin-key.pem --client-certificate=admin.pem

    设置环境项中名为default的默认集群和用户

    kubectl config set-context default --cluster=kubernetes --user=cluster-admin

    设置默认环境项为defaultkubectl config use-context default

 

7.k8s网络类型

   Node Network: 与外部网络接口  

   Service Network: ipvs规则当中的网络、路由提供调度

   Pod Network(flannel network): 节点当中pod的内部网络无法与外界通信,Overlay Network/VXLAN/Flannel

 

8.K8s yaml文件编写

   编写规则:大小写敏感,缩进表示层级关系,缩进只能用空格,#注释,两种结构类型(lists/maps)

   参数:version(K8S API的版本),kind(资源类型和角色),metadata(元数据对象),metadata.name(元数据对象的名字,如pod名), metadata.namespace(元数据对象的命名空间),

   Spec(详细定义对象), spec.containers[](Spec对象的容器列表定义),spec.containers[].name(容器的名字),spec.containers[].image(镜像名称)

 

9.Pod重启策略、镜像拉取策略

   重启策略(restartPolicy字段配置):Always、Never 、OnFailure

   镜像拉取策略(imagePullPolicy字段配置): Always、Never、IfNotPresent

 

10.Pod存活探针种类(k8s通过存活探针检查容器是否还在运行)

   httpGet: 通过容器IP/端口/路径发送http请求,返回200-400状态码表示成功

   exec: 容器内执行shell,根据退出状态码是否为0判断,0健康,非0不健康

   TCPSocket:与容器IP/端口建立TCPSocket链接,能建立则探测成功,反之失败

 

11.Pod一直处于pending状态怎么排查

   Pod开始创建时,本身会处于pending状态,这是可能正在拉取镜像,正在创建容器过程。一直pending,首先使用kubectl describe查看pod events详细信息,

   可能原因:调度器调度失败(调度器无法为pod分配一个合适的node节点,如node节点资源紧张、污点pod没有定义容忍等),pvc/pv无法动态创建

posted on   枫飘过的天1  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示