k8s技术1--k8s部署及核心资源管理

    技术2022-07-16  78

    文章目录

    一.k8s的由来及作用1.传统架构分析2.k8s的由来及作用3.k8s的作用 二.k8s系统架构1.Master节点组成2.Node节点的组成 三.k8s逻辑架构1.POD2.Controller3.Service 四.K8S快速部署1.节点规划及环境准备1.1 节点规划1.2 环境准备 2.安装docker环境及依赖3.配置主节点ETCD4.配置Master节点5.node节点配置6.验证节点状态7.配置flannel网络8.配置master为镜像仓库 二. k8s核心资源管理1.PODS1.1 创建第一个pod1.2 加载容器1.3 查询1.4 创建第二个pod1.5 更新镜像 2.RC应用3.depolyment资源管理:4.Service应用4.1 Service部署4.2 Service验证

    一.k8s的由来及作用

    1.传统架构分析

    最传统的架构是所有的页面链接都是建立在一个域名之上,一旦主web服务器down机那么所有服务都无法打开 传统架构的优缺点: 优点: 1)开发简单,集中式管理 2)基本不会重复开发 3)功能都在本地,没有分布式的管理和调用消耗 缺点: 1)效率低:开发都在同一个项目改代码,相互等待,冲突不断 2)维护难:代码功能耦合在一起,新人不知道何从下手 3)不灵活:构建时间长,任何小修改都要重构整个项目,耗时 4)稳定性差:一个微小的问题,都可能导致整个应用挂掉 5)扩展性不够:无法满足高并发下的业务需求

    2.k8s的由来及作用

    1)为了不影响用户的使用,提升应用服务的健壮性,把每个链接都拆分成一个独立的一个服务,单独的模块,相对于其它模块互不影响,对于能够拆分成单独模块的服务简称微服务。 2)对于每个独立的服务都是一个单独的容器运行而来的(假设所有的服务都是由docker部署的),当web服务器处于访问压力过大时如何实现资源的弹性伸缩,服务的自动发现,以及版本的自动更新,如果这些管理都是通过人力来完成,那么将消耗大量的人力和时间,如果有一个统一的管理工具,那么就可以省去很的人力和物力。 3)我们知道kvm虚拟机多的时候可以由openstack来管理,容器数量太多的时候可以通k8s来编排管理。

    3.k8s的作用

    k8s是一个docker集群的管理工具

    自愈: 重新启动失败的容器,在节点不可用时,替换和重新调度节点上的容器,对用户定义的健康检查不响应的容器会被中止,并且在容器准备好服务之前不会把其向客户端广播。 弹性伸缩: 通过监控容器的cpu的负载值,如果这个平均高于80%,增加容器的数量,如果这个平均低于10%,减少容器的数量 服务的自动发现和负载均衡: 不需要修改您的应用程序来使用不熟悉的服务发现机制,Kubernetes 为容器提供了自己的 IP 地址和一组容器的单个 DNS 名称,并可以在它们之间进行负载均衡。 升级和一键回滚: Kubernetes 逐渐部署对应用程序或其配置的更改,同时监视应用程序运行状况,以确保它不会同时终止所有实例。 如果出现问题,Kubernetes会为您恢复更改,利用日益增长的部署解决方案的生态系统。 密码管理

    二.k8s系统架构

    从系统架构来看,k8s分为2个节点 Master 控制节点 Node 工作节点

    1.Master节点组成

    API Server :提供k8s API接口 主要处理Rest操作以及更新Etcd中的对象 是所有资源增删改查的唯一入口。 Scheduler:资源调度器 根据etcd里的节点资源状态决定将Pod绑定到哪个Node上 Controller Manager:负责保障pod的健康存在,资源对象的自动化控制中心,Kubernetes集群有很多控制器。 Etcd:这个是Kubernetes集群的数据库,所有持久化的状态信息存储在Etcd中

    2.Node节点的组成

    Docker Engine: 负责节点容器的管理工作,最终创建出来的是一个Docker容器。 kubelet 安装在Node上的代理服务,用来管理Pods以及容器/镜像/Volume等,实现对集群对节点的管理。 kube-proxy 安装在Node上的网络代理服务,提供网络代理以及负载均衡,实现与Service通讯。

    三.k8s逻辑架构

    从逻辑架构上看,k8s分为 Pod Controller Service

    1.POD

    POD是k8s的最小单位 POD的IP地址是随机的,删除POD会改变IP POD都有一个根容器 一个POD内可以由一个或多个容器组成 一个POD内的容器共享根容器的网络命名空间 一个POD内的网络地址由根容器提供

    2.Controller

    用来管理POD,控制器的种类有很多 - RC Replication Controller 控制POD有多个副本 - RS ReplicaSet RC控制的升级版 - Deployment 推荐使用,功能更强大,包含了RS控制器 - DaemonSet 保证所有的Node上有且只有一个Pod在运行 - StatefulSet 有状态的应用,为Pod提供唯一的标识,它可以保证部署和scale的顺序

    3.Service

    NodeIP 对外提供用户访问 CluterIP 集群内部IP,可以动态感知后面的POD IP POD IP POD的IP

    四.K8S快速部署

    1.节点规划及环境准备

    1.1 节点规划

    k8s-m :10.0.0.11 k8s-n1 :10.0.0.12 k8s-n2 :10.0.0.13

    1.2 环境准备

    所有节点: 1.关闭防火墙: systemctl stop firewalld systemctl disable firewalld 2.关闭selinux: sed -i 's/enforcing/disabled/' /etc/selinux/config setenforce 0 3.关闭swap: swapoff -a 临时 vim /etc/fstab 永久 4.添加主机名与IP对应关系(记得设置主机名): cat /etc/hosts master 10.0.0.11 node1 10.0.0.12 node2 10.0.0.13 ......

    2.安装docker环境及依赖

    1.上传docker-k8s.tar软件到各节点/opt,并解压,进入目录进行安装 tar xf docker-k8s.tar cd /opt/pkg yum localinstall -y *.rpm 2.在master:上传k8s-master到/opt 并解压,进入目录进行安装 unzip k8s-master.zip cd /opt/k8s-master yum localinstall -y *.rpm 3.在node1和node2:上传k8s-node到两个node节点/opt 并解压,进入目录进行安装 tar xf k8s-node.tar yum localinstall -y *.rpm 4.在所有节点: vim /usr/lib/systemd/system/docker.service #在[Service]区域下增加一行 ...... [Service] ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT systemctl daemon-reload systemctl restart docker

    3.配置主节点ETCD

    在master节点: vim /etc/etcd/etcd.conf ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379" ETCD_ADVERTISE_CLIENT_URLS="http://10.0.0.11:2379" 重启服务并测试 systemctl restart etcd.service systemctl enable etcd.service etcdctl set name lbz etcdctl get name

    4.配置Master节点

    在master节点: vim /etc/kubernetes/apiserver KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0" KUBE_API_PORT="--port=8080" KUBE_ETCD_SERVERS="--etcd-servers=http://10.0.0.11:2379" KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16" KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota" vim /etc/kubernetes/config(当你想要master既做master又做node的时候需要修改这个配置文件,此实验不用) 重启服务 systemctl enable kube-apiserver.service systemctl start kube-apiserver.service systemctl enable kube-controller-manager.service systemctl start kube-controller-manager.service systemctl enable kube-scheduler.service systemctl start kube-scheduler.service

    5.node节点配置

    vim /etc/kubernetes/config KUBE_MASTER="--master=http://10.0.0.11:8080" vim /etc/kubernetes/kubelet KUBELET_ADDRESS="address=10.0.0.12/13" KUBELET_HOSTNAME="--hostname-override=10.0.0.12/13" KUBELET_API_SERVER="--api-servers=http://10.0.0.11:8080" 重启服务 systemctl enable kubelet.service systemctl start kubelet.service systemctl enable kube-proxy.service systemctl start kube-proxy.service

    6.验证节点状态

    [root@master ~]# kubectl get nodes NAME STATUS AGE 10.0.0.12 Ready 4m 10.0.0.13 Ready 4m

    7.配置flannel网络

    1.所有节点: yum install -y wget wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo yum install flannel -y sed -i 's#http://127.0.0.1:2379#http://10.0.0.11:2379#g' /etc/sysconfig/flanneld 2.master节点: etcdctl mk /atomic.io/network/config '{"Network": "172.16.0.0/16"}' etcdctl get /atomic.io/network/config {"Network": "172.16.0.0/16"} systemctl enable flanneld.service systemctl start flanneld.service service docker restart systemctl restart kube-apiserver.service systemctl restart kube-controller-manager.service systemctl restart kube-scheduler.service 3.node节点: systemctl enable flanneld.service systemctl start flanneld.service service docker restart systemctl restart kubelet.service systemctl restart kube-proxy.service

    8.配置master为镜像仓库

    1.master节点 vim /etc/sysconfig/docker 把这一行修改为如下: OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false --regist ry-mirror=https://aeckruos.mirror.aliyuncs.com --insecure-registry=10.0.0.11:5000' 修改完毕 systemctl restart docker 配置本地registry docker pull nginx docker tag nginx 10.0.0.11:5000/lbz/nginx:v1 docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry registry docker push 10.0.0.11:5000/lbz/nginx:v1 2.node节点 vim /etc/sysconfig/docker 把这一行修改为如下: OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false --insecure-registry=10.0.0.11:5000' 修改完毕 systemctl restart docker docker pull 10.0.0.11:5000/lbz/nginx:v1

    二. k8s核心资源管理

    1.PODS

    1.1 创建第一个pod

    在master节点: mkdir /opt/yml/test -p cd /opt/yml/test [root@k8s test]# cat k8s_pod.yml apiVersion: v1 kind: Pod metadata: name: nginx labels: app: web spec: containers: - name: nginx image: 10.0.0.11:5000/lbz/nginx:v1 ports: - containerPort: 80

    1.2 加载容器

    在master节点: master: 上传准备好的容器为本地register (pod-infrastructure-latest.tar.gz) [root@master test]# docker load -i pod-infrastructure-latest.tar.gz [root@master test]# docker images [root@k8s-m opt]# docker tag docker.io/tianyebj/pod-infrastructure:latest 10.0.0.11:5000/lbz/pod-infrastructure:latest [root@master test]# docker images [root@master test]# docker push 10.0.0.11:5000/lbz/pod-infrastructure:latest 在所有node节点: vim /etc/kubernetes/kubelet KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=10.0.0.11:5000/lbz/pod-infrastructure:latest" systemctl restart kubelet.service 在master节点: [root@k8s yml]# kubectl create -f k8s_pod.yml pod "nginx" created

    1.3 查询

    [root@master test]# kubectl describe pods Scheduled Successfully assigned nginx to 10.0.0.12 [root@master test]# kubectl get pods NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 3m

    1.4 创建第二个pod

    在master节点: [root@master test]# cp k8s_pod.yml k8s_pod2.yml [root@master test]# vim k8s_pod2.yml apiVersion: v1 kind: Pod metadata: name: nginx1 labels: app: web1 spec: containers: - name: nginx1 image: 10.0.0.11:5000/lbz/nginx:v1 ports: - containerPort: 80 ~ ~ "k8s_pod2.yml" 13L, 199C written [root@master test]# kubectl create -f k8s_pod2.yml pod "nginx1" created [root@master test]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE nginx 1/1 Running 0 8m 172.16.10.2 10.0.0.13 nginx1 1/1 Running 0 1m 172.16.49.2 10.0.0.12

    1.5 更新镜像

    在master节点: [root@master test]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE 10.0.0.11:5000/lbz/nginx v1 2622e6cca7eb 2weeks ago 132.1 MB [root@master test]# docker tag 2622e6cca7eb 10.0.0.11:5000/lbz/nginx:v2 [root@master test]# docker push 10.0.0.11:5000/lbz/nginx:v2 用新镜像启动新容器代替原来的容器 [root@master test]# vim k8s_pod.yml image: 10.0.0.11:5000/lbz/nginx:v2 [root@master test]# kubectl replace --force -f k8s_pod.yml [root@master test]# kubectl get pods NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 35s [root@master test]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE nginx 1/1 Running 0 1m 172.16.10.2 10.0.0.13

    2.RC应用

    保证指定数量的pod始终存活,rc通过标签选择器来关联pod

    1.rc部署 在节点master: [root@master ~]# kubectl delete pod nginx pod "nginx" deleted 配置yml文件 [root@master test]# pwd /opt/yml/test cat >k8s_nginx_rc.yml<<EOF apiVersion: v1 kind: ReplicationController metadata: name: nginxrc spec: replicas: 3 selector: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: 10.0.0.11:5000/lbz/nginx:v2 ports: EOF [root@master test]# kubectl create -f k8s_nginx_rc.yml [root@master test]# kubectl get rc NAME DESIRED CURRENT READY AGE nginxrc 3 3 3 6s [root@master test]#kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE nginxrc-0rjnj 1/1 Running 0 19s 172.16.10.2 10.0.0.13 nginxrc-2rcxl 1/1 Running 0 19s 172.16.49.2 10.0.0.12 nginxrc-bn2z6 1/1 Running 0 19s 172.16.10.3 10.0.0.13 2.rc验证 模拟故障:删除掉一个会很快启动一个 [root@master test]# kubectl delete pod nginxrc-0rjnj 又自动起了一个pod [root@master test]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE nginxrc-2rcxl 1/1 Running 0 2h 172.16.49.2 10.0.0.12 nginxrc-77hh6 1/1 Running 0 3s 172.16.49.3 10.0.0.12 nginxrc-bn2z6 1/1 Running 0 2h 172.16.10.3 10.0.0.13 3.rc副本数增删 1)修改配置文件 vim k8s_nginx_rc.yml [root@master test]# kubectl replace -f k8s_nginx_rc.yml 2)kubectl edit rc nginxrc 3)kubectl scale rc nginxrc --replicas=4 4.滚动升级及回滚 cp k8s_nginx_rc.yml k8s_nginx_rc1.yml kubectl rolling-update nginxrc -f k8s_nginx_rc1.yml --update-period=10s 语法:kubectl rolling-update OLDRCNAME -f NEWRCFILE --update-period=5s 回滚即是相反操作即可 注: 在升级过程中,可以进行回退。如果升级完成,则不可以使用这条指令进行回退。滚动升级中间出现了问题: #kubectl rolling-update myapp-v1 -f my-app-v2-rc.yml --update-period=10 --rollback 语法:kubectl rolling-update OLDRCNAME NEWRCNAME --rollback

    3.depolyment资源管理:

    rc在滚动升级之后,会造成服务访问中断,于是k8s引入了deployment资源 1)通过控制RS来保证POD始终保持相应的数量副本 2)支持滚动更新,回滚,回滚默认保留10个版本 3)提供声明式配置,支持动态修改 4)管理无状态应用最理想的控制器

    1.depolyment资源管理 在master节点: vim k8s_nginx_dev.yml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: nginx spec: replicas: 4 template: metadata: labels: app: nginx spec: containers: - name: nginx image: 10.0.0.11:5000/lbz/nginx:v2 ports: - containerPort: 80 [root@master test]# kubectl create -f k8s_nginx_dev.yml [root@master test]# kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx 4 4 4 4 1m 2.deployment滚动升级 kubectl set image deployment/nginx nginx=10.0.0.11:5000/lbz/nginx:v1 当镜像出错时恢复到原来的状态: kubectl rollout undo deployment/nginx 3.HPA: 实现自动pod伸缩 [root@master test]# kubectl autoscale deployment nginx --min=2 --max=6 --cpu-percent=80 [root@master test]# kubectl get horizontalpodautoscalers NAME REFERENCE TARGET CURRENT MINPODS MAXPODS AGE nginx Deployment/nginx 80% <waiting> 2 6 1m kubectl get horizontalpodautoscalers kubectl edit horizontalpodautoscalers nginx 在线修改配置

    4.Service应用

    4.1 Service部署

    提供负载均衡,使对外能够访问

    1.创建svc配置文件 在master节点: vim k8s_nginx_svc.yml apiVersion: v1 kind: Service metadata: name: nginxsvc spec: type: NodePort ports: - port: 80 nodePort: 30001 selector: app: nginx [root@master test]# kubectl create -f k8s_nginx_svc.yml service "nginxsvc" created [root@master test]# kubectl get svc NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 10.254.0.1 <none> 443/TCP 6d nginxsvc 10.254.173.110 <nodes> 80:30001/TCP 46s [root@master test]# kubectl curl -r 10.0.0.13:30001 [root@master test]# kubectl curl -r 10.0.0.12:30001

    4.2 Service验证

    在浏览器输入http://10.0.0.13:30001或者是http://10.0.0.12:30001

    Processed: 0.010, SQL: 9