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 netchecker–agent–n4zvc 1/1 Running 0 5m22s
default netchecker–server–589d76f698–wh8jr 2/2 Running 1 (5m14s ago) 5m20s
//一套开源的网络和网络安全方案
kube–system calico–kube–controllers–75fcdd655b–8khd4 1/1 Running 0 5m36s
kube–system calico–node–mpppj 1/1 Running 0 5m52s
//作为内网的DNS服务器,用于服务发现
kube–system coredns–76b4fb4578–dsj8r 1/1 Running 0 5m29s
kube–system dns–autoscaler–7874cf6bcf–44clw 1/1 Running 0 5m27s
//api
kube–system kube–apiserver–master 1/1 Running 0 6m51s
//通过 apiserver 监控整个集群的状态,并确保集群处于预期的工作状态
kube–system kube–controller–manager–master 1/1 Running 1 6m51s
//实现Kubernetes Service的通信与负载均衡机制
kube–system kube–proxy–488bp 1/1 Running 0 6m4s
//控制面进程,负责将 Pods 指派到节点上
kube–system kube–scheduler–master 1/1 Running 1 6m56s
//监控kubernetes集群资源
kube–system metrics–server–749474f899–8bbrf 1/1 Running 0 5m15s
kube–system nginx–proxy–worker 1/1 Running 0 6m4s
//大幅提升集群内DNS解析性能
kube–system nodelocaldns–b5vgs 1/1 Running 0 5m26s
//deployment通过yaml定义了一组pod,动态管理和伸缩
[root@master ~]# kubectl get deploy –A
NAMESPACE NAME READY UP–TO–DATE AVAILABLE AGE
default netchecker–server 1/1 1 1 2d12h
kube–system calico–kube–controllers 1/1 1 1 2d12h
kube–system coredns 1/1 1 1 2d12h
kube–system dns–autoscaler 1/1 1 1 2d12h
kube–system metrics–server 1/1 1 1 2d12h
[root@master ~]# kubectl get –o yaml deploy netchecker–server
创建一个门户网站
之前提到的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 UP–TO–DATE AVAILABLE AGE
mytestweb 1/1 1 1 79s
netchecker–server 1/1 1 1 2d16h
[root@master k8s_test]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mytestweb–575f89bf65–ms4cg 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 CLUSTER–IP EXTERNAL–IP 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
mytestweb–575f89bf65–8zgrr 1/1 Running 0 13m
mytestweb–575f89bf65–cplr8 1/1 Running 0 13m
mytestweb–575f89bf65–ms4cg 1/1 Running 0 4h48m
mytestweb–575f89bf65–pwzl5 1/1 Running 0 13m
mytestweb–575f89bf65–vng4n 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: my–pv1
labels:
type: local
spec:
storageClassName: manual #声明类型后续PVC会匹配绑定
capacity:
storage: 1Gi
accessModes:
– ReadWriteMany
hostPath: #声明本地存储
path: /data/hostpath
//类似nfs这种的远端存储,阿里云,AWS
apiVersion: v1
kind: PersistentVolume
metadata:
name: my–pv2
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: my–pvc
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/my–pv 1Gi RWX Retain Bound default/my–pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES
persistentvolumeclaim/my–pvc Bound my–pv 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 CHANGE–CAUSE
1 <none>
2 <none>
#回滚到指定版本
kubectl rollout undo deploy mytestweb —to–revision=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博客
暂无评论内容