Kubernetes部署实战(kubernetes搭建)

Kubernetes部署实战(kubernetes搭建)

解决方案goocz2025-02-01 12:22:1512A+A-

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               443/TCP          2d19h
mytestweb            NodePort    10.233.159.30            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:              
Selector:                 app=mytestweb
Type:                     NodePort
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.233.159.30
IPs:                      10.233.159.30
Port:                       8080/TCP
TargetPort:               80/TCP
NodePort:                   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:                   

//循环访问
[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         
2         

#回滚到指定版本
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博客

点击这里复制本文地址 以上内容由goocz整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

果子教程网 © All Rights Reserved.  蜀ICP备2024111239号-5