《k8s网络指南》Kubernetes部署实战

K8S的优势

1、故障迁移(自愈):当某一个node节点关机或挂掉后,node节点上的服务会自动转移到另一个node节点上,这个过程所有服务不中断。这是docker或普通云主机是不能做到的

2、资源调度(弹性伸缩):当node节点上的cpu、内存不够用的时候,可以扩充node节点,新建的pod就会被kube-schedule调度到新扩充的node节点上,如果CPU负载低于阈值则减少容器的数量

3、服务的自动发现和负载均衡: 不需要修改您的应用程序来使用不熟悉的服务发现机制,Kubernetes 为容器提供了自己的 IP 地址和一组容器的单个 DNS 名称,并可以在它们之间进行负载均衡。

4、资源隔离:创建开发、运维、测试三个命名空间,切换上下文后,开发人员就只能看到开发命名空间的所有pod,看不到运维命名空间的pod,这样就不会造成影响,互不干扰

5、安全:不同角色有不同的权限,查看pod、删除pod等操作;RBAC认证增加了k8s的安全

6、滚动升级和一键回滚: Kubernetes 逐渐部署对应用程序或其配置的更改,同时监视应用程序运行状况,以确保它不会同时终止所有实例。 如果出现问题,Kubernetes会为您恢复更改

K8S部署实战

我们针对上述k8s的特点,搭建一个k8s集群用于提供web服务,并逐一验证上述优势。

我这边直接用图形化安装K8S集群的软件直接搞了一个master节点,一个worker节点:

//pod是最小调度单元,包含了一个业务功能 [root@localhost ~]# kubectl get pods A NAMESPACE NAME READY STATUS RESTARTS AGE //收集主机信息并发送给指定check服务器 default netcheckeragentn4zvc 1/1 Running 0 5m22s default netcheckerserver589d76f698wh8jr 2/2 Running 1 (5m14s ago) 5m20s //一套开源的网络和网络安全方案 kubesystem calicokubecontrollers75fcdd655b8khd4 1/1 Running 0 5m36s kubesystem caliconodempppj 1/1 Running 0 5m52s //作为内网的DNS服务器,用于服务发现 kubesystem coredns76b4fb4578dsj8r 1/1 Running 0 5m29s kubesystem dnsautoscaler7874cf6bcf44clw 1/1 Running 0 5m27s //api kubesystem kubeapiservermaster 1/1 Running 0 6m51s //通过 apiserver 监控整个集群的状态,并确保集群处于预期的工作状态 kubesystem kubecontrollermanagermaster 1/1 Running 1 6m51s //实现Kubernetes Service的通信与负载均衡机制 kubesystem kubeproxy488bp 1/1 Running 0 6m4s //控制面进程,负责将 Pods 指派到节点上 kubesystem kubeschedulermaster 1/1 Running 1 6m56s //监控kubernetes集群资源 kubesystem metricsserver749474f8998bbrf 1/1 Running 0 5m15s kubesystem nginxproxyworker 1/1 Running 0 6m4s //大幅提升集群内DNS解析性能 kubesystem nodelocaldnsb5vgs 1/1 Running 0 5m26s //deployment通过yaml定义了一组pod,动态管理和伸缩 [root@master ~]# kubectl get deploy A NAMESPACE NAME READY UPTODATE AVAILABLE AGE default netcheckerserver 1/1 1 1 2d12h kubesystem calicokubecontrollers 1/1 1 1 2d12h kubesystem coredns 1/1 1 1 2d12h kubesystem dnsautoscaler 1/1 1 1 2d12h kubesystem metricsserver 1/1 1 1 2d12h [root@master ~]# kubectl get o yaml deploy netcheckerserver

创建一个门户网站

之前提到的k8s是通过yaml文件定义deployment,然后再启动服务暴露端口号给用户访问,那么我们先定义一个最简单的yaml文件myTestWeb.yaml:

//myTestWeb.yaml apiVersion: apps/v1 kind: Deployment metadata: creationTimestamp: null labels: app: mytestweb name: mytestweb spec: replicas: 1 selector: matchLabels: app: mytestweb strategy: {} template: metadata: creationTimestamp: null labels: app: mytestweb spec: containers: image: nginx:latest name: nginx resources: {} status: {} [root@master k8s_test]# kubectl apply f myTestWeb.yaml [root@master k8s_test]# kubectl get deployments NAME READY UPTODATE AVAILABLE AGE mytestweb 1/1 1 1 79s netcheckerserver 1/1 1 1 2d16h [root@master k8s_test]# kubectl get pods NAME READY STATUS RESTARTS AGE mytestweb575f89bf65ms4cg 1/1 Running 0 87s //service.yaml apiVersion: v1 kind: Service metadata: creationTimestamp: null labels: app: mytestweb name: mytestweb spec: ports: port: 8080 protocol: TCP targetPort: 80 selector: app: mytestweb type: NodePort status: loadBalancer: {} service/mytestweb created [root@master k8s_test]# kubectl get service NAME TYPE CLUSTERIP EXTERNALIP PORT(S) AGE kubernetes ClusterIP 10.233.0.1 <none> 443/TCP 2d19h mytestweb NodePort 10.233.159.30 <none> 8080:32046/TCP 19s //修改一下门户网站页面

这样我们访问192.168.206.131:32046就可以访问了:

高可用水平扩容

如果我们发现访问我们的门户网站流量很大,这时我们可以生成5个web服务器网站,然后用作高可用以及负载均衡,具体做法只要修改myTestWeb.yaml中的replicas: 1声明成replicas: 10,最后再apply一下即可:

[root@master k8s_test]# kubectl get pod NAME READY STATUS RESTARTS AGE mytestweb575f89bf658zgrr 1/1 Running 0 13m mytestweb575f89bf65cplr8 1/1 Running 0 13m mytestweb575f89bf65ms4cg 1/1 Running 0 4h48m mytestweb575f89bf65pwzl5 1/1 Running 0 13m mytestweb575f89bf65vng4n 1/1 Running 0 13m [root@master k8s_test]# kubectl describe service/mytestweb Name: mytestweb Namespace: default Labels: app=mytestweb Annotations: <none> Selector: app=mytestweb Type: NodePort IP Family Policy: SingleStack IP Families: IPv4 IP: 10.233.159.30 IPs: 10.233.159.30 Port: <unset> 8080/TCP TargetPort: 80/TCP NodePort: <unset> 32046/TCP Endpoints: 10.234.218.10:80,10.234.218.9:80,10.234.28.6:80 + 2 more Session Affinity: None External Traffic Policy: Cluster Events: <none> //循环访问 [root@master k8s_test]# while true;do curl 192.168.206.131:32046;sleep 1;done //查看各pod运行日志发现,确实实现了负载均衡 192.168.206.131 [04/Apr/2022:11:57:10 +0000] “GET / HTTP/1.1” 200 615 “-“ “curl/7.29.0” “-“ 192.168.206.131 [04/Apr/2022:11:57:11 +0000] “GET / HTTP/1.1” 200 615 “-“ “curl/7.29.0” “-“ 10.234.218.0 [04/Apr/2022:11:57:09 +0000] “GET / HTTP/1.1” 200 330 “-“ “curl/7.29.0” “-“ 10.234.218.0 [04/Apr/2022:11:57:08 +0000] “GET / HTTP/1.1” 200 615 “-“ “curl/7.29.0” “-“ 10.234.218.0 [04/Apr/2022:11:57:07 +0000] “GET / HTTP/1.1” 200 615 “-“ “curl/7.29.0” “-“ //service的node调度策略是可以修改的 /* Taint 污点:节点不做普通分配调度,是节点属性,属性值有三个 NoSchedule:一定不被调度 PreferNoSchedule:尽量不被调度(也有被调度的几率) NoExecute:不会调度,并且还会驱逐Node已有Pod 调度器标签选择也会影响调度,例如yaml文件说增加如下,那么只有打上键值对mylabel=pickup的node才有pod会调度在上面: nodeSelector: mylabel: pickup */ //缩容就不写了,数字减回去,然后apply

有状态服务

之前的演示都是无状态的服务,即多个Pod创建是没有顺序的,且共享存储。而有状态的服务具有固定的主机名具以及有持久化存储。

k8s支持存储相关的是PV和PVC,这个在之前的章节介绍过,这里只讲创建关系,pv是显示地指示提供存储的大小和位置,而PVC是一个pv抽象,也是说我们绑定一个pvc后,它会按照storageClassName、accessModes 以及容量这些是否满足要求,遍历各个PV,并将满足要求的绑定起来,这有一个好处就是假如某一个PV失效了,我们可以新建一个满足PVC模板的PV即可,否则没有PVC,那么我们就需要修改各个依赖该失效PV的pod的yaml文件,改成新的PV,如果pod数量很多,那改起来就像自行车爆胎 -气炸了。

我们来看看几种PV存储的类型,其实就是yaml定义,用的时候就是apply一下就行,很方便:

/* ReadWriteOnce:可读科写,但支持被单个node挂载 ReadOnlyMany:可以以读的方式被多个node挂载 ReadWriteMany:可以以读写的方式被多个node挂载 */ //本地存储 apiVersion: v1 kind: PersistentVolume metadata: name: mypv1 labels: type: local spec: storageClassName: manual #声明类型后续PVC会匹配绑定 capacity: storage: 1Gi accessModes: ReadWriteMany hostPath: #声明本地存储 path: /data/hostpath //类似nfs这种的远端存储,阿里云,AWS apiVersion: v1 kind: PersistentVolume metadata: name: mypv2 labels: type: remote spec: storageClassName: manual capacity: storage: 1Gi accessModes: ReadWriteMany nfs: path: /data/nfs # 声明nfs存储 server: 192.168.108.100 //声明PVC统一管控内存,需求2G,acess权限为RWM,类型为manual,那么my-pv1和my-pv2就会被bound apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mypvc spec: storageClassName: manual accessModes: ReadWriteMany resources: requests: storage: 2Gi [root@master k8s_test]# kubectl get pv,pvc NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM persistentvolume/mypv 1Gi RWX Retain Bound default/mypvc NAME STATUS VOLUME CAPACITY ACCESS MODES persistentvolumeclaim/mypvc Bound mypv 1Gi RWX

滚动发布与回退

由于k8s yaml定义一切的特性,我们发布新版本也可以做到热升级,只需要将指定我们想要发布的新版本docker镜像,然后apply一下yaml即可:

spec: containers: image: nginx:1.15 # 指定镜像版本为1.15 name: nginx # 查看升级版本 [root@master k8s_test]# kubectl rollout status deploy mytestweb deployment “web” successfully rolled out # 查看历史版本 [root@master k8s_test]# kubectl rollout history deployment mytestweb deployment.apps/mytestweb REVISION CHANGECAUSE 1 <none> 2 <none> #回滚到指定版本 kubectl rollout undo deploy mytestweb torevision=2

Reference

为什么要用k8s – effortsing – 博客园 (cnblogs.com)

K8S原理架构与实战(基础篇) – 知乎 (zhihu.com)

k8s系列教程:为什么要使用k8s? (jdkdownload.com)

k8s安装步骤(1.22.0版本)_简单风的博客-CSDN博客_k8s安装

代码狂魔:K8S原理架构与实战(基础篇)

https://labs.play-with-k8s.com/

k8s的一些基本命令 – jason小蜗牛 – 博客园 (cnblogs.com)

k8s删除deployment_k8s命令全集2020版(最新整理)_weixin_39814369的博客-CSDN博客

CentOS7设置固定IP_rossisy的博客-CSDN博客_centos 固定ip

docker警告:WARNING: IPv4 forwarding is disabled. Networking will not work._杰哥的技术杂货铺的博客-CSDN博客

    THE END
    喜欢就支持一下吧
    点赞11 分享
    评论 抢沙发
    头像
    欢迎您留下宝贵的见解!
    提交
    头像

    昵称

    取消
    昵称表情代码图片

      暂无评论内容