第101天-全流程安装-kubernetes

k8s核心组件和架构

1.0、k8s各个组件

etcd   保存了整个集群的状态;
apiserver  提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
controller manager  负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
scheduler           负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;
kubelet             负责维护容器的生命周期,同时也负责volume (CVI)和网络(CNI)的管理;
Container runtime   负责镜像管理以及Pod和容器的真正运行(CRI) ;
kube-proxy          负责为Service提供cluster内部的服务发现和负载均衡;

kube-apiserver
API 服务器是 Kubernetes 控制面的组件, 该组件公开了 Kubernetes API。 API 服务器是 Kubernetes 控制面的前端。
Kubernetes API 服务器的主要实现是 kube-apiserver。 kube-apiserver 设计上考虑了水平伸缩,也就是说,它可通过部署多个实例进行伸缩。 你可以运行 kube-apiserver 的多个实例,并在这些实例之间平衡流量。


etcd
etcd 是兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。
您的 Kubernetes 集群的 etcd 数据库通常需要有个备份计划。
要了解 etcd 更深层次的信息


kube-scheduler
控制平面组件,负责监视新创建的、未指定运行节点(node)的 Pods,选择节点让 Pod 在上面运行。
调度决策考虑的因素包括单个 Pod 和 Pod 集合的资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据位置、工作负载间的干扰和最后时限。


kube-controller-manager
在主节点上运行 控制器 的组件。
从逻辑上讲,每个控制器都是一个单独的进程, 但是为了降低复杂性,它们都被编译到同一个可执行文件,并在一个进程中运行。
这些控制器包括:
节点控制器(Node Controller): 负责在节点出现故障时进行通知和响应
任务控制器(Job controller): 监测代表一次性任务的 Job 对象,然后创建 Pods 来运行这些任务直至完成
端点控制器(Endpoints Controller): 填充端点(Endpoints)对象(即加入 Service 与 Pod)
服务帐户和令牌控制器(Service Account & Token Controllers): 为新的命名空间创建默认帐户和 API 访问令牌


Node 组件
节点组件在每个节点上运行,维护运行的 Pod 并提供 Kubernetes 运行环境。

kubelet
一个在集群中每个节点(node)上运行的代理。 它保证容器(containers)都 运行在 Pod 中。
kubelet 接收一组通过各类机制提供给它的 PodSpecs,确保这些 PodSpecs 中描述的容器处于运行状态且健康。 kubelet 不会管理不是由 Kubernetes 创建的容器。

kube-proxy
kube-proxy 是集群中每个节点上运行的网络代理, 实现 Kubernetes 服务(Service) 概念的一部分。
kube-proxy 维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与 Pod 进行网络通信。
如果操作系统提供了数据包过滤层并可用的话,kube-proxy 会通过它来实现网络规则。否则, kube-proxy 仅转发流量本身。

容器运行时(Container Runtime)
容器运行环境是负责运行容器的软件。
Kubernetes 支持多个容器运行环境: Docker、 containerd、CRI-O 以及任何实现 Kubernetes CRI (容器运行环境接口)。


插件(Addons)
插件使用 Kubernetes 资源(DaemonSet、 Deployment等)实现集群功能。 因为这些插件提供集群级别的功能,插件中命名空间域的资源属于 kube-system 命名空间。
下面描述众多插件中的几种。有关可用插件的完整列表,

image-20210608163839453

k8s安装部署

1.1、准备环境

image-20210608163745624

 1  ping www.baidu.com
    2  vi /etc/host
    3  vi /etc/hosts
    4  yum install -y bash-completion 
    5   systemctl stop firewalld
    6   systemctl disable firewalld
    7  setenforce 0
    8  getenforce
    9  vi /etc/selinux/config
   10  systemctl stop NetworkManager.service
   11  systemctl disable NetworkManager.service
   12  yum install -y wget
   13  wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
   14  yum install -y net-tools vim lsof lrzsz tree screen tcpdump
   15  systemctl stop postfix.service
   16  systemctl disable postfix.service
   17   cat /etc/redhat-release
   18  vi /etc/hosts  10.0.0.6  k8s-master01  10.0.0.7  k8s-node01  10.0.0.8 k8s-node02
   19   scp -rp /etc/hosts 10.0.0.7:/etc/hosts
   20   scp -rp /etc/hosts 10.0.0.8:/etc/hosts
   21  history
   

kubernetes
   
k8s-master01       k8s-node01      k8s-node02
10.0.0.6           10.0.0.7        10.0.0.8
==============================================
k8s-master01  
------------
查看节点状态
# kubectl get nodes  

查看pods状态容器
# kubectl get pods

删除多余的节点
# kubectl delete node 10.0.0.8

查看组件状态
# kubectl get componentstatus 

查看pod具体信息
kubectl describe pod nginx   

显示调度到哪个节点
# kubectl get pod nginx -o wide 
# kubectl get all -o wide

删除一个pod
# kubectl delete pod nginx  
 
创建pod 
# kubectl create -f nginx_pod.yaml

安装数据库
yum install -y etcd

设置配置文件
# vim /etc/etcd/etcd.conf 
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://10.0.0.6:2379"

开启服务
# systemctl start etcd   &&  systemctl enable etcd     

查看端口
# netstat -lntup

下载kubernetes-master服务
# yum install kubernetes-master.x86_64 -y

# vim /etc/kubernetes/config   
KUBE_MASTER="--master=http://10.0.0.6:8080"

# 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.6:2379"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
KUBE_API_ARGS="--service-node-port-range=10000-60000"

# vim /etc/kubernetes//kubelet                 #负责容器的生命周期
KUBELET_ADDRESS="--address=10.0.0.6"
KUBELET_PORT="--port=10250"
KUBELET_HOSTNAME="--hostname-override=k8s-master01"
KUBELET_API_SERVER="--api-servers=http://10.0.0.6:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=docker.io/tianyebj/pod-infrastructure:latest"  #更换下载镜像地址


开启服务(启动三个服务)
# systemctl start kube-apiserver.service   &&  systemctl start kube-scheduler.service   &&  systemctl start kube-controller-manager.service


检测三个服务的状态
# kubectl get componentstatus   
# yum install kubernetes-node.x86_64 -y 


k8s-node1与k8s-node2
---------------------
# yum install kubernetes-node.x86_64 -y 

启动服务
# systemctl start kubelet.service  &&    systemctl enable kubelet.service  
# systemctl start kube-proxy.service  &&  systemctl enable kube-proxy.service



k8s-node01(改:两个文件)
------------------------
修改配置文件
# vim /etc/kubernetes/config 
KUBE_MASTER="--master=http://10.0.0.6:8080"

# vim /etc/kubernetes//kubelet 
KUBELET_ADDRESS="--address=10.0.0.7"
KUBELET_PORT="--port=10250"
KUBELET_HOSTNAME="--hostname-override=k8s-node01"
KUBELET_API_SERVER="--api-servers=http://10.0.0.6:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=docker.io/tianyebj/pod-infrastructure:latest"

启动服务
# systemctl start kubelet.service    &&  systemctl enable kubelet.service 
# systemctl start kube-proxy.service &&  systemctl enable kube-proxy.service


k8s-node02(改:两个文件)
----------------------
# vim /etc/kubernetes//config
KUBE_MASTER="--master=http://10.0.0.6:8080"

# vim /etc/kubernetes//kubelet 
KUBELET_ADDRESS="--address=10.0.0.8"
KUBELET_PORT="--port=10250"
KUBELET_HOSTNAME="--hostname-override=10.0.0.8"
KUBELET_API_SERVER="--api-servers=http://10.0.0.6:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=docker.io/tianyebj/pod-infrastructure:latest"

启动服务
# systemctl start kubelet.service    &&  systemctl enable kubelet.service 
# systemctl start kube-proxy.service &&  systemctl enable kube-proxy.service

1.2、flannel网络安装

image-20210608163934748

k8s-master01k8s-node01和k8s-node02
-------------------------------------
# yum install flannel -y


k8s-master01
-------------
# vim /etc/sysconfig/flanneld 
FLANNEL_ETCD_ENDPOINTS="http://10.0.0.6:2379"
# etcdctl set /atomic.io/network/config '{ "Network": "172.16.0.0/16" }'  #在etcd里给Flannel网段建立了Key
# systemctl start flanneld.service &&  systemctl enable flanneld.service
# systemctl restart docker


k8s-node01  与   k8s-node02
# vim /etc/sysconfig//flanneld 
FLANNEL_ETCD_ENDPOINTS="http://10.0.0.6:2379"
# systemctl restart flanneld.service   &&  systemctl enable flanneld.service
# systemctl restart docker


k8s-master01  k8s-node01  k8s-node02
--------------------------------------
测试跨宿主机容器之间的互通性
docker容器1.13版把容器联通规则调了,手动调试后才能联通,要永久生效就要修改配置文件
# docker pull busybox  
# docker run -it busybox

docker容器联通规则修改(临时修改)
# iptables -P FORWARD ACCEPT  
Chain FORWARD (policy ACCEPT)

docker容器联通规则修改永久修改)
# vim /usr/lib/systemd/system/docker.service
ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT

重新启动
# systemctl daemon-reload  && systemctl restart docker

[root@k8s-master01 ~]# iptables -L -n  #查看文件信息
Chain FORWARD (policy DROP)


1.3、创建pod

k8s-master-10.0.0.6
--------------------
# mkdir k8s  &&  cd k8s
# mkdir pod  &&  cd pod
# vim nginx_pod.yaml
apiVersion: v1
kind: Pod
metadata:
   name: nginx
   labels:
   app: web
spec:
  containers:
   - name: nginx
     image: nginx:1.13
     ports:
      - containerPort: 80
     

修改apiserver文件
# vim /etc/kubernetes/apiserver	  
改:KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"

重启apiserver服务
# systemctl restart kube-apiserver.service

创建启动pod服务
# kubectl create -f nginx_pod.yaml	  


nginx启动不成功
# kubectl get pod nginx
nginx   0/1    ContainerCreating   0




10.0.0.7-k8s-node2  k8s-master01 ,k8s-node01
===============================================
查找原因修改kubelet文件
在master节点查明结果是pull failed发生错误,配置文件是通过redhat地址来下载nginx启动需要的镜像,但却显示不能下载,因此就要想办法,最好的办法是改配置文件。
 思考:为什么在执行一个nginx(pod)的时候要下载这样镜像了,为什么非要从Redhat官方下载了,换地址下载不就行了,这是有配置文件(/etc/kubernetes/kubelet)决定的。  改为:--pod-infra-container-image(**下文容器镜像地址**)=docker.io/tianyebj/pod-infrastructure:latest
# docker pull  registry.access.redhat.com/rhel7/po-infratructure:latest  :no such file or diretory
搜索更换镜像地址:
# docker search pod-infrastructure docker.io/tianyebj/pod-infrastructure:latest
# docker pull  docker.io/tianyebj/pod-infrastructure:latest
# docker tag  docker.io/tianyebj/pod-infrastructure:latest  10.0.0.6:5000/pod-infrastructure:latest

# vi /etc/kubernetes/kubelet
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=docker.io/tianyebj/pod-infrastructure:latest"
# systemctl restart kubelet.service

k8s-master01  k8s-node01
--------------------------
# docker search pod-infrastructure 
# vi /etc/kubernetes/kubelet
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=docker.io/tianyebj/pod-infrastructure:latest"
# systemctl restart kubelet.service


k8s-node02
-------------
 上传本地包镜像
# docker load -i(<)   pod-infrastructure-latest.tar.gz
# docker load -i(<)   docker_nginx1.13.tar.gz
# systemctl restart docker

1.4、创建官方registry私有仓库(harbor)

10.0.0.6-k8s-master1
----------------------
寻找docker镜像:registry
# docker search registry 

下载镜像
# docker pull   docker.io/registry

运行启动私有仓库
# docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry  registry 


测试:
# docker search pod-infrastructure  docker.io/tianyebj/pod-infrastructure:latest
# docker pull  docker.io/tianyebj/pod-infrastructure:latest
推送到数据库
# docker tag  docker.io/tianyebj/pod-infrastructure:latest  10.0.0.6:5000/pod-infrastructure:latest
# docker push  10.0.0.6:5000/pod-infrastructure:latest


10.0.0.7-k8s-slave1   10.0.0.8-k8s-slave2
-------------------------------------------
# vim /etc/sysconfig/docker 
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false --registry-mirror=https://registry.docker-cn.com --insecure-registry=10.0.0.6:5000'

# vi /etc/kubernetes/kubelet
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=10.0.0.6:5000/pod-infrastructure:latest"


重新启动服务 
# systemctl restart docker
# systemctl restart kubelet.service


下载并推送到私有仓库中
# docker pull nginx:latest   && docker tag nginx:latest  10.0.0.6:5000/nginx:latest  &&   docker push   10.0.0.6:5000/nginx:latest

Replication Controller的作用

1.1、编写yaml文件,启动pod

应用托管在Kubernetes之后,Kubernetes需要保证应用能够持续运行,这是Rc的工作内容,它会确保任何时间Kubernetes中都有指定数量的Pod在运行。在此基础上,Rc还提供了一些更高级的特性,比如滚动升级、升级回滚等。


创建一个rc(yaml)文件
--------------------
# mkdir rc  &&  cd rc
# vi  nginx_rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
   name: myweb
spec:
  replicas: 2     #副本数,两个pod
  selector:       #选择器
    app: myweb
  template:       #pod启动模板
    metadata:
      labels:
        app: myweb
    spec:
      containers:
      - name: myweb
        image: 10.0.0.6:5000/nginx:1.13
        ports:
        - containerPort: 80

创建一个容器
# kubectl create -f nginx_rc.yaml   

修改nginx这个pod的标签
# kubectl edit pod nginx  

生成三台rc副本
# kubectl scale rc myweb --replicas=3

写入容器
# echo 'node1' >index.html  && kubectl cp index.html myweb-88zqk:/usr/share/nginx/html/index.html
# echo 'node2' >index.html &&  kubectl cp index.html myweb-ftxbw:/usr/share/nginx/html/index.html
# echo 'node3' >index.html  && kubectl cp index.html myweb-thh6c:/usr/share/nginx/html/index.html

1.2、Rc的版本升级与回滚

滚动升级是一种平滑过渡的升级方式,通过逐步替换的策略,保证整体系统的稳定,在初始并级的时候就可以及时发现、调整问题,以保证问题影响度不会扩犬。Kubernetes中滚劫升级的命令如下:
$ kubectl rolling-update myweb -f nginx-rc2.yaml --update-period=10s

升级开始后,首先依据提供的定义文件创建V2版本的RC,然后每隔10s (--update-period=10s厂逐步的增茄版本的Pod副本数,遂步减少V1版本Pod的副本数。升级完成之后,删除V1版本的RC,保留V2版本的RC,及实现滚动升级。

升级过程中,发生了错误中涂退出时.可以选择继续升级。
Kubernetes能够智能的判断升级中断之前的状态,然后紧接着继续执行升级。当然,地司以迸行向退,命令如下:
$ kubectl rolling-update myweb myweb2 --update-period=10s --rollback

10.0.0.6-k8s-master
--------------------
滚动升级前要再跟nignx_rc.yaml 复制一份
# cd rc 
# cp nginx_rc.yaml  nginx_rc2.yaml 
# vim nginx_rc2.yaml
apiVersion: v1
kind: ReplicationController
metadata:
   name: myweb2
spec:
  replicas: 2
  selector:
    app: myweb2
  template:
    metadata:
      labels:
        app: myweb2
    spec:
      containers:
      - name: myweb2
        image: 10.0.0.6:5000/nginx:1.15
        ports:
        - containerPort: 80
        
        
滚动升级开始     
# kubectl rolling-update myweb -f nginx_rc2.yaml  --update-period=30s      # 每间隔30s升级一次
# kubectl rolling-update myweb2 -f nginx_rc.yaml  --update-period=30s      # 一键回滚

回滚出现问题后,为了回滚成功,可以加--rollback
# kubectl rolling-update myweb  myweb2  --rollback 


1.3、pod对外暴露端口Svc

运行在docker中的业务,想要被外界访问,我们需要为它做端口映射才能被访问,那么运行在k8s中的容器,为什么不能直接为它做端口映射呢?

k8s中三中IP地址类型:
nodeip 
clusterip 
serviceip
podip

创建一个service(yaml)文件
# mkdir svc  && cd svc
# vim nginx_svc.yaml
apiVersion: v1
kind: Service               #资源类型
metadata:           
  name: myweb
spec:
  type: NodePort            #端口映射
  ports:
    - port: 80              #cluster ip端口80
      nodePort: 30000       #映射宿主机的30000端口 
      targetPort: 80        #pod的IP地址 
  selector:
    app: myweb
  
启动服务
# kubectl create -f nginx_svc.yaml

更新一下文件
# kubectl  apply -f nginx_svc.yaml

网络的详细信息
# kubectl describe svc 
# kubectl describe svc myweb   

测试:
10.0.0.6
10.0.0.7
10.0.0.8

Deployment资源

1.1、deployment打标签

deployment也是保证pod高可用的一种方式,明明已经有RC,为什么还要引入deployment呢?
因为deployment解决了RC的一个痛点

rc滚动更新kubectl rolling-update myweb -f nginx_rc2.yaml --update-period=1s后,内部kubectl edit svc myweb的web标签没有改变,造成宿主机网络通不了外网curl 10.0.0.(6,7,8):10000不通

滚动更新 nginx_rc2.yaml后出现的问题,解决方案引出deployment

10.0.0.6-k8s-master
=====================
  在rc的滚动升级章节,回顾
# cd rc
# cp nginx_rc.yaml  nginx_rc2.yaml 
apiVersion: v1
kind: ReplicationController
metadata:
   name: myweb2
spec:
  replicas: 2
  selector:
    app: myweb2
  template:
    metadata:
      labels:
        app: myweb2
    spec:
      containers:
      - name: myweb2
        image: 10.0.0.6:5000/nginx:1.15
        ports:
        - containerPort: 80

更新nginx版本
# docker pull nginx:1.15  && docker tag docker.io/nginx:1.15 10.0.0.6:5000/nginx:1.15 &&  docker push 10.0.0.6:5000/nginx:1.15  

  在service(yaml)创建章节,回顾
# mkdir svc  &&  cd svc
# vim nginx_svc.yaml
apiVersion: v1
kind: Service              #资源类型
metadata:           
  name: myweb
spec:
  type: NodePort            #端口映射
  ports:
    - port: 80              #clusterip端口80
      nodePort: 30000       #映射宿主机的30000端口 
      targetPort: 80        #pod的IP地址 
  selector:
    app: myweb
    
# kubectl create -f nginx_svc.yaml

网络的详细信息
# kubectl describe svc  
Selector:          app:  myweb       #从上面最后一条命令可以看出,service服务的标签还是nginx_rc.yaml的,pod标签 ,导致curl  -I   10.0.0.6:10000不通


升级nginx版本
# cd rc &&  kubectl rolling-update myweb -f nginx_rc2.yaml --update-period=1s    
 
升级代码后不通
# curl -I 10.0.0.6:10000    

修改svc配置文件
# kubectl edit svc myweb
          app: myweb2

查看结果
# kubectl describe svc myweb 




deployment自动给service打标签
-----------------------------
手动kubectl edit svc myweb改了后,为了以后能自动改myweb标签,所以就引入了个deployment来自动给service打标签
创建deployment(yaml)文件
# vim nginx_deploy.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment
spec: 
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: 10.0.0.6:5000/nginx:1.13
        ports:
        - containerPort: 80
        
 # kubectl create -f nginx_deploy.yaml
 # kubectl get all     #此时deploy只是启动了,但端口却没有映射到svc服务中,此时暴露deployment的端口80,形成svc的映射关系
 
 暴露deployment 端口80  端口类型是NodePort类型 
 # kubectl expose deployment nginx-deployment --port=80 --type=NodePort
 
 测试结果
 # curl -I 10.0.0.6:42663    联通

1.2、deployment升级与回滚

10.0.0.6-k8s-master
===================
升级 
-----
1)升级nginx修改文件
# curl -I 10.0.0.6:42663    联通
Server:  nginx/1.13.12

修改配置文件
# kubectl edit deployment nginx-deployment     
  - image: 10.0.0.6:5000/nginx:1.15
  
 启动升级
# kubectl rolling-update  nginx-deployment -f nginx_deploy.yaml --update-period=1s    
  
测试结果
# curl -I 10.0.0.6:42663
Server: nginx/1.15.5



回滚
-----
# kubectl rollout undo deployment nginx-deployment     #undo=回滚
# curl -I 10.0.0.6:42663


查看历史升级与回滚记录
--record              #查看历史改变记录
# kubectl run nginx --image=10.0.0.6:5000/nginx:1.13 --replicas=3 --record  

查看历史回滚版本信息,记录没有内容
# kubectl rollout history deployment nginx-deployment
# kubectl rollout history deployment nginx  
1		            kubectl run nginx --                         image=10.0.0.6:5000/nginx:1.13


升级nginx容器
# kubectl set image deployment nginx nginx=10.0.0.6:5000/nginx:1.15   

回滚nginx容器
# kubectl rollout undo deployment nginx --to-revision=1

Pod之间访问规则

1.1、tomcat 与mysql

思考 
k8s中不同类型的pod之间如何相互访问?
列如web如何访问db服务?                                                                              
服务与服务相互访问需要借助VIP,应为每个pod地址不是固定的
VIP:  10.254.69.201 

Mysql
-------
下载镜像:
# docker pull mysql:5.7
# vim mysql-rc.yml
 image: 10.0.0.6:5000/mysql:5.7


创建mysql服务
# kubectl create -f mysql-rc.yml
# kubectl create -f mysql-svc.yml

查看svc服务
# kubectl get all -o wide
svc/mysql        10.254.69.201 

创建三个副本
# kubectl scale rc myweb --replicas=3  
# kubectl exec -it mysql-qkkr7 bash



Tomcat
--------
下载tomcat依赖包,解压,并调试文件内容
下载地址:
wget  https://www.qstack.com.cn/tomcat_demo.zip
# unzip tomcat_demo.zip &&  cd   tomcat_demo
# vim  tomcat-rc.yml
 image: 10.0.0.6:5000/tomcat-app:v2
  value: '10.254.69.201'

下载tomcat镜像   
# docker pull tomcat  && docker tag docker.io/tomcat:latest  10.0.0.6:5000/tomcat-app:v2  &&  docker push  10.0.0.6:5000/tomcat-app:v2

创建tomcat副本数与service
#  kubectl create -f tomcat-rc.yml
#  kubectl create -f tomcat-svc.yml

测试
# curl 10.0.0.6:30008

k8s附件组件DNS服务

1.1、service发现机制:ENV

Kubernetes中有一个很重要的特性,服务自发现。一旦一个service被创建,该service的service lP和service port等信息都可以被注入到pod中供它们使用。
Kubernetes主要支持两种service发现机制:
环境变量和DNS。
没有dns服务的时候,kubernetes会采用环境变量的形式,一旦有很多个service,环境变量会变得很复杂,为了解决这个问题,我们使用DNS服务。

查看环境变量增加值
# kubectl get all -o wide
# kubectl exec -it myweb-37r4c  /bin/bash
root@myweb-37r4c:/usr/local/tomcat# env|grep -iE 'kubernetes|mysql|myweb'|wc -l
23 

创建容器
# cd k8s/  && cd svc/  &&  vim  nginx_svc.yaml
  name: test
# kubectl create -f nginx_svc.yaml  
  
查看环境变量增加值
# kubectl get pods
root@myweb-s6w91:/usr/local/tomcat# env|grep -iE 'kubernetes|mysql|myweb|test'|wc -l
30                                                     # 多了七个环境变量,DNS服务不需要ENV变量

1.2、service发现机制:DNS

10.0.0.6  master
==================
引入:dns服务 域名系统
  下载地址:  wget   https://www.qstack.com.cn/skydns.zip
  
# cd /k8s  &&  unzip skydns.zip 
# cd skydns &&  vim skydns-rc.yaml 
  - --kube-master-url=http://10.0.0.6:8080  
  
1) 探针检查服务能不能运行起来
livenessProbe:
          httpGet:
            path: /healthz-kubedns
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 60
          timeoutSeconds: 5
          successThreshold: 1
          failureThreshold: 5 

 2) 探针检查容器可不可用
  readinessProbe:
          httpGet:
            path: /readiness
            port: 8081
            scheme: HTTP

# kubectl create -f skydns-rc.yaml 
# kubectl create -f skydns-svc.yaml 
== 
# kubectl create  -f .        #skydns-svc.yaml与skydns-rc.yaml都运行在一个命名空间里面:kube-system 中


# kubectl get pod --namespace=kube-system                
kube-dns-2898898123-dzc39   4/4       Running   0          2m            #查看命名空间   

# kubectl create -f .      命令之后deploy起了个rs,rs起个pod,skdns中dns与svc起了个地址:10.254.230.254 ,这个地址要配置到k8s中,才能起效
# kubectl get all --namespace=kube-system
# kubectl get svc --namespace=kube-system   
deploy/kube-dns  
svc/kube-dns                10.254.230.254
rs/kube-dns-2898898123 
po/kube-dns-2898898123-dzc39 


10.0.0.6 master  10.0.0.7 node1  10.0.0.8  node2
--------------------------------------------------
修改配置文件 /etc/kubernetes/kubelet配置文件,增加如下
# vim /etc/kubernetes/kubelet
KUBELET_ARGS="--cluster_dns=10.254.230.254  --cluster_domain=cluster.local"

重启服务
# systemctl restart kubelet.service


10.0.0.6-master    
---------------
测试dns服务加入结果
# kubectl create -f test_dns_pod.yaml 
# kubectl get pods

测试结果
# kubectl exec -it busybo2 sh    
/ # nslookup test
Address: 10.254.57.167

/ #  nslookup myweb
Address: 10.254.140.98

# cd ../tomcat_demo/  &&  kubectl delete -f . 
#  vim tomcat-rc.yml
  value: 'mysql'
# kubectl create .    &&  kubectl get all 

pod资源健康检查

1.1、livenessProbe:检查pod是否存活的

readinessprode:检查是否可用
readinessprode:检查是否可用
探针检测方法
exec:      执行一段命令
httpget:   检测状态码,200-300就ok ,400-500就有问题
tcpsoket  测试某个端口是是否连接成功
# cd /k8s  &&  mkdir health
# vim pod_nginx_exec.yaml

apiVersion: v1
kind: Pod
metadata:
   name: exec
spec:
  containers:
   - name: nginx
     image: 10.0.0.6:5000/nginx:1.13
     ports:
       - containerPort: 80
     args:
       - /bin/sh
       - -c
       - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
     livenessProbe:
       exec:
         command:
           - cat
           - /tmp/healthy
       initialDelaySeconds: 5
       periodSeconds: 5
 
创建服务
#  kubectl create -f pod_nginx_exec.yaml

测试结果
# kubectl get pod exec
exec      1/1       Running 



[root@k8s-master01 k8s]# vim pod_nginx_httpget.yaml
apiVersion: v1
kind: Pod
metadata:
   name: httpget
spec:
  containers:
   - name: nginx
     image: 10.0.0.6:5000/nginx:1.13
     ports:
       - containerPort: 80
     livenessProbe:  
       httpGet:
         path: /index.html
         port: 80
       initialDelaySeconds: 3
       periodSeconds: 3
       
# kubectl get pod httpget
httpget   1/1       Running 	   

测试结果:
让探针访问不到,只要进入pod中,把首页移走
# kubectl exec -it httpget bash
/# cd /usr/share/nginx/html
/# ls
50x.html  index.html
/# mv index.html /tmp/
/# exit

[root@k8s-master01 k8s]# kubectl describe pod httpget
led with statuscode: 404
代表已经重启了

1.2、readinessprode:检查是否可用

vim  nginx-rc-readiness.yaml
apiVersion: v1
kind: ReplicationController
metadata:
   name: readiness
spec:
  replicas: 2
  selector:
      app:  readiness
  template:
    metadata:
      labels:
        app:  readiness
    spec:		
      containers:
      - name: readiness
   	    image: 10.0.0.6:5000/nginx:1.13
        ports:
        - containerPort: 80
        readinessProbe:
          httpGet:
             path: /jackie.html
             port: 80
          initialDelaySeconds: 3
          periodSeconds: 3

# kubectl create -f nginx-rc-readiness.yaml

向外暴露端口:
# kubectl expose rc readiness --port=80   

查看readinesspod状态
# kubectl describe svc readiness
Endpoints:		
# kubectl get all -o wide
po/readiness-r1d3g   0/1       Running 

进入容器,修改配置文件
# kubectl exec -it readiness-r1d3g  bash
/# cd /usr/share/nginx/html
/# echo jackie >jackie.html
/# ls
50x.html  index.html  jackie.html
/# exit

查看状态
# kubectl describe svc readiness
Endpoints:		172.16.12.5:80

1.3、dashboard安装部署

dashbard是k8sweb界面的一个工具
   下载地址:wget https://www.qstack.com.cn/dashboard.zip
解压包:
#  unzip dashboard.zip
vim dashboard-deploy.yaml
  -  --apiserver-host=http://10.0.0.6:8080
image: 10.0.0.6:5000/kubernetes-dashboard-amd64:v1.4.1

下载镜像
# docker pull  docker.io/kubernetesui/dashboard   &&  docker tag docker.io/openpitrix/dashboard:latest 10.0.0.6:5000/kubernetes-dashboard-amd64:v1.4.1   &&  docker push 10.0.0.6:5000/kubernetes-dashboard-amd64:v1.4.1

创建服务
# kubectl create -f  .

测试访问:
10.0.0.6:8080

namespace的作用

1.1、创建资源空间

Namespace (命名空间)是Kubernetes系统中的另一个非常重要的概念,Namespace在很多情况下用于实现多租户的资源隔离。
cms项目用到数据库商城项目也需要数据库
多租户的资源隔离:你在阿里云上买一台云服务器,其他用户是看不到的用户和用户之间阿里云是隔离的,namespace实现的就是这种多用户的效果。
同一个namespace下面不允许出现两个service叫mysql
10.0.0.6-master
=================
1.1  创建资源空间
-----------------
# kubectl create namespace jackie
# kubectl get namespace
default       Active    7d
jackie        Active    4m
kube-system   Active    7d

查看资源空间
# kubectl get all --all-namespaces  

删除资源空间
# kubecvtl delete namespace jackie  

1.2、创建配置文件

# mkdir namespace &&  cd namespace
# cp ../rc/nginx_rc.yaml .
# cp ../svc/nginx_svc.yaml .


1.2.1、修改Rc配置文件
-------------------
# vim  nginx_rc.yaml
   namespace: jackie
   
启动服务
# kubectl create -f nginx_rc.yaml 

查看资源空间
# kubectl get all --all-namespaces
  jackie      rc/myweb 
  default     rc/myweb  

查看jackie中的的容器
# kubectl get all --namespace=jackie
rc/myweb   2 
po/myweb-33r7w   1/1       Running   0          28s
po/myweb-dnqb3   1/1 



1.2.2、修改SVC配置文件
---------------------
# vim nginx_svc.yaml 
  namespace: jackie        增 
  namePort:10000           删 

创建服务
# kubectl create -f  nginx_svc.yaml

查看资源
# kubectl get all --namespace=jackie
svc/test   10.254.85.251   <nodes>       80:19730

测试访问:
# curl -I 10.0.0.6:19730

1.3、访问k8s中应用的方式

service不同访问类型
访问k8s应用我们要建立一个service,service里有不同的类型,比如
NodePode类型:  10.0.0.6:30008/demo/就是NodePode类型访问我们的容器
ClusterIP类型: ClusterIP就是使用的我们10.0.0.6:8080/ui/的方式来访问

当去建立一个service的时候,如果不指定一个type:NodePode类型的话。我们默认的使用的是ClusterIP类型,
访问:
http://10.0.0.6:8080/api/proxy/namespaces/jackie/services/myweb/


第一种:NodePort类型
type: NodePort
 ports:
  - port: 80
    targetPort: 80
    nodePort: 30008
    
第二种:ClusterlP类型
type: ClusterlP
 ports:
  - port: 80
    targetPort: 80

k8s的heapster监控服务

1.0、服务端安装heapster

![Image 047](D:\OneDrive\OneDrive - Office 365\桌面\剪切\Image 047.png)

10.0.0.6-master
----------------
提供资源监控服务
作用:为后期的弹性伸缩做准备
安装heapster服务
    下载:wget https://www.qstack.com.cn/heapster-influxdb.zip
# cd  k8s   &&  mkdir heapster  &&  cd heapster	 &&  unzip heapster-influxdb.zip

唯一要改的是:heapster-controller.yaml这个文件
# vim heapster-controller.yaml
      - --source=kubernetes:http://10.0.0.6:8080?inClusterConfig=false
      
下载镜像     
# cat  heapster-controller.yaml
kubernetes/heapster:canary
# docker pull kubernetes/heapster:canary

创建并查看heapster 服务
# kubectl create -f .
# kubectl  get svc --namespace=kube-system
monitoring-grafana     10.254.237.83    <none>        80/TCP              57s
monitoring-influxdb    10.254.159.40    <none>        8083/TCP,8086/TCP 
heapster               10.254.233.120   <none>        80/TCP              57s


查看容器运行状态
# kubectl get pod -n kube-system
heapster-dtmv7                                 0/1       Pending                      1m
influxdb-grafana-zgnxb                         0/2       Pending                    1m
kube-dns-2898898123-f988m                      4/4       Running                     2m
kubernetes-dashboard-latest-2913367092-cc808   0/1       ImagePullBackOff 	

10.0.0.8-node2
---------------
node02
每个node节点上还需要cAdvisor服务,cadvisor都被集成到kubernetes服务中,查看cpu和内存资源
# vim /etc/kubernetes/kubelet 
KUBELET_ARGS="--cluster_dns=10.254.230.254  --cluster_domain=cluster.local --cadvisor-port=8080"

启动服务
# systemctl restart kubelet.service
# netstat -lntup

 访问:
 http://10.0.0.8:8080/containers/

![Image 054](D:\OneDrive\OneDrive - Office 365\桌面\剪切\Image 054.png)

k8s的弹性伸缩

水平pod自动伸缩     Horizontal Pod Autoscaler   
操作对象:
Replication Controller
ReplicaSet
Deployment对应的Pod
根据观察到的CPU使用量与用户的阈值进行比对,做出是否需要增减实例数量的决策。controller目前使用heapSter来检测CPU使用量,检测周期默认是30秒。


弹性伸缩
主要是监控cpu的使用率,一但达到我们设定的阈值,我们就做策略让它增加,做策略有个周期,持续五分钟发现cpu使用率高,那就增加一个pod,来减轻压力,过了五分钟之后发现使用率很低,就减少pod。

1172.31.4.6-master
-------------------
# mkdir hpa  &&  cd hpa  &&  cp  ../rc/nginx_rc.yaml .
# vim nginx_rc.yaml 

 resources:
           limits:
             cpu: 100m
             memory: 50Mi
           requests:
              cpu: 100m
              memory: 50Mi
   web3

设置扩缩容
# kubectl autoscale replicationcontroller myweb3 --max=10 --min=1 --cpu-percent=5



# kubectl get all -o  wide
hpa/myweb3   ReplicationController/myweb3   5%        <waiting> 
rc/myweb3      2       2         1   
po/myweb3-lz9cq      1/1


10.0.0.8-node02
---------------
安装一个apache压力测试工具
压力测试
# yum install httpd-tools  -y
# ab -n 500000 -c 20  http://172.16.66.2/index.html   

查看详情
# kubectl describe  hpa myweb3   

k8s存储pv和pvc

1.0、PV与PVC概念

k8s中为什么使用存储
k8s中的副本控制器保证了pod的始终存储,却保证不了pod中的数据。只有启动一个新pod的,之前pod中的数据会随着容器的删掉而丢失!
Rs、Rc能保证k8s中有指定的副本数运行,不能保证pod中一旦产生数据,启动一个新的pod,随着数据的删除而丢失、

PersistentVolume (一些简称PV) :
由管理员添加的的一个存储的描述,是一个全局资源,包含存储的类型,存储的大小和访问模式等。它的生命周期独立于Pod,例如当使用它的Pod销毁时对PV没有影响。

PersistentVolumeClaim (一些简称PVC):
是Namespace里的资源,描述对PV的一个请求。请求信息包含存储大小,访问模式等。

PV和PVC的概念
 pv全称为持久化存储,它是由k8s管理员添加的描述。支持多种存储
 pvc和pv是一一绑定的,pod使用pvc作为桥梁,使pod连接pv,实现持久化存储。需要在k8s 上安装服务端和客户端
 
 
10.0.0.6-master01
------------------
# kubectl exec -it myweb3-lz9cq  bash
/# cd /usr/share/nginx/html/
/# ls
50x.html  index.html
/# echo 'jackie' >index.tml

访问:
10.0.0.6:45772  
jackie

# kubectl expose rc myweb3 --port=80 --type=NodePort
# kubectl delete pod myweb3-lz9cq  
访问:10.0.0.6:45772  
nginx                          #这就是没有安装pvc服务,数据没有持久化

1.1、PV存储

k8smaster节点 node01、node02  
-----------------------------
 为了pod能够挂载,所有主机必安装
 #   yum install nfs-utils -y    
 
10.0.0.6-master01
==================
1.0.0、nfs配置文件
------------------
# vim /etc/exports
/data 
10.0.0.0/24(rw,sync,no_root_squash,no_all_squash)

创建挂载目录
# mkdir /data/k8s -p

启动服务
# systemctl restart rpcbind
# systemctl restart nfs

查看nfs配置
# showmount -e 10.0.0.6
Export list for 10.0.0.6:
/data 10.0.0.0/24  

1.0.1、创建PV配文件
-------------------
# cd k8s  &&  mkdir volume  && cd volume  
# vim test-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name:   test
  labels:
    type: test
spec:
  capacity:
   storage: 10Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: nfs
  nfs:
    path: "/data/k8s"
    server: 10.0.0.6
    readOnly: false

创建服务
# kubectl create -f  test-pv.yaml 

测试结果
# kubectl get pv
  test      10Gi       RWX           Recycle  
  
  
1.0.2、创建PVC桥梁
------------------
# vim test-pvc.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi

启动服务
# kubectl create -f  test-pvc.yaml   

查看结果
# kubectl get pvc
nfs       Bound     test2     10Gi       RWX   


1.0.3、测试
------------
创建文件 修改文件内容	
# vim test-pv.yaml 	  
改:	    name: test
        storage: 10Gi
        
修改文件内容为test2
 [root@k8s-master01 volume]# vim test-pv.yaml 	  
改:	    name: test2
        storage: 10Gi

修改文件内容为test3      
[root@k8s-master01 volume]# vim test-pv.yaml 
改:       name: test3
          storage: 6Gi
          
          
测试pvc改文件配置后,看连接那个PV上
# vim  test-pvc.yaml
  name: nfs2
  storage: 7Gi
  
测试结果
# kubectl get pv
test      10Gi                Recycle
test2     10Gi                Recycle 
test3     6Gi                 Recycle  	  
# kubectl get pvc
nfs       Bound     test2     10Gi      
nfs2      Bound     test      10Gi 



创建配置文件test2
# vim test-pv.yaml                 
apiVersion: v1
kind: PersistentVolume
metadata:
  name:   test2
  labels:
    type: test
spec:
  capacity:
   storage: 10Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: "/data/k8s"
    server: 10.0.0.6
    readOnly: false

创建服务
# kubectl create -f  test-pv.yaml 

测试结果
# kubectl get pv
test      10Gi       RWX           Recycle         
test2     10Gi       RWX           Recycle

k8s持久化实战

image-20210608152910818

1.1、PV持久化存储

10.0.0.6-master
=================
在k8目录创建目录:tomcat_demo_pv
# cp -a tomcat_demo/  tomcat_demo_pv   &&   cd   tomcat_demo_pv

设置配置文件
# vim tomcat-rc.yml 
 value: 'mysql'

启动服务
# kubectl create -f .


创建持久化PV存储
# cp ../volume/test-pv* .

修改test-pv.yaml 和test-pvc.yaml 文件名字
# mv test-pv.yaml  mysql-pv.yaml
# mv test-pvc.yaml  mysql-pvc.yaml


1.0、创建PV配文件
-----------------
#  vim mysql-pv.yaml 
 apiVersion: v1
kind: PersistentVolume
metadata:
  name:   mysql
  labels:
    type: mysql
spec:
  capacity:
   storage: 10Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: "/data/mysql"
    server: 10.0.0.6
    readOnly: false
    
创建挂载目录
# mkdir /data/mysql

创建服务
# kubectl create -f mysql-pv.yaml 

1.2、创建PVC配文件
------------------
#  vim mysql-pvc.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi

创建服务
# kubectl create -f mysql-pvc.yaml 


查看状态pv和pvc
---------------
# kubectl get pvc
mysql     bound     mysql     10Gi       RWX 
# kubectl get pv
mysql     10Gi   Recycle   Bound   default/mysql  

1.2、RC副本创建

# cp mysql-rc.yml mysql-rc-pvc.yaml
# vim mysql-rc-pvc.yaml 
apiVersion: v1
kind: ReplicationController
metadata:
  name: mysql
spec:
  replicas: 1
  selector:
    app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: 10.0.0.6:5000/mysql:5.7
          ports:
          - containerPort: 3306
          env:
          - name: MYSQL_ROOT_PASSWORD
            value: '123456'
          volumeMounts:
          - name: data
            mountPath: /var/lib/mysql
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName:  mysql 

启动服务
# kubectl apply -f mysql-rc-pvc.yaml 

1.3、测试结果

10.0.0.8-node2
---------------
# kubectl get all
po/mysql-99hsw       1/1       Running    

查看描述
# kubectl describe pod  po/mysql-99hsw   

删除pod
# kubectl delete pod mysql-99hsw

访问                                          
10.0.0.8:30008                      #数据保存在



# ls /data/mysql/
auto.cnf         ibdata1             private_key.pem
ca-key.pem       ib_logfile0         public_key.pem
ca.pem           ib_logfile1         server-cert.pem
client-cert.pem  ibtmp1              server-key.pem
client-key.pem   mysql               sys
ib_buffer_pool   performance_schema

glusterfs横向扩容

1.0、centos

1.1、glusterfs扩容存储

image-20210608153545081

分布式文件管理系统glusterfs
glusterfs是个开源分布式文件管理系统,具有较强的横向扩展功能,
可以支持PB存储容量和数千客户端。通过网络互联成为一个并行的网络文件系统。具有高性能,扩展性,高可用性。

10.0.0.6-master  10.0.0.7-node1  10.0.0.8-node2
-------------------------------------------------
# yum install centos-release-gluster  glusterfs-server  -y
# systemctl start glusterd.service   && systemctl enable glusterd.service
# mkdir -p /gfs/test1  && mkdir -p /gfs/test2


10.0.0.6-master
---------------
所有节点加入资源池
# gluster pool list
# gluster peer probe k8s-node01
# gluster peer probe k8s-node02


创建分布式复制卷
gluster volume create jackie replica 2 k8s-master01:/gfs/test1 k8s-master01:/gfs/test2 k8s-node01:/gfs/test1 k8s-node01:/gfs/test2 force

启动卷
gluster volume start jackie

查看卷
gluster volume info jackie

挂载卷
mount -t glusterfs 10.0.0.6:/jackie   /mnt

再创建一个node节点后,格式化后把新节点的Brick加入资源池的卷中,每次至少加两个



分布式复制卷扩容
扩容前查看容量:
df -h 
10.0.0.6:/jackie      199G  5.7G  194G    3% /mnt                #添加磁盘

扩容命令:
# gluster volume add-brick jackie k8s-node02:/gfs/test1 k8s-node02:/gfs/test2 force

扩容后查看容器:
df -h 
10.0.0.6:/jackie      299G  8.0G  291G    3% /mnt

测试:
# cd /mnt/  &&  unzip xiaoniaofeifei.zip
# ls
2000.png 21.js icon.png index.html


1.2、glusterfs做后端存储

1.2.1、endpoint关联service

service和endpoint是通过名字来关联的,endpoint名字是glusterfs,service也得是glusterfs,才能关联上


10.0.0.6-master
=================
glusterfs做后端存储
# cd k8s/volume

查看说明
# kubectl explain pv.spec
# kubectl explain pv.spec.glusterfs

1.1、创建endpoint
-------------------
# vim glusterfs-ep.yaml
apiVersion: v1
kind: Endpoints
metadata:
  name: glusterfs
  namespace: default
subsets:
- addresses:
  - ip:  10.0.0.6
  - ip:  10.0.0.7
  - ip:  10.0.0.8
  ports:
  - port: 49152
    protocol: TCP
    
启动服务
# kubectl create -f  glusterfs-ep.yaml


1.2、创建service
-----------------
# kubectl create -f  glusterfs-svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: glusterfs
  namespace: default
spec:
 ports:
 - port: 49152
   protocol: TCP
   targetPort: 49152
 sessionAffinity: None
 type: ClusterIP 
 
 # kubectl create -f  glusterfs-svc.yaml 


查看结果
# kubectl get ep
glusterfs   10.0.0.6:49152,10.0.0.7:49152,10.0.0.8:49152   57s
# kubectl get svc
Endpoints:		10.0.0.6:49152,10.0.0.7:49152,10.0.0.8:49152

1.2.2、创建PV和PVC

创建gluste的PV配置文件
-----------------------
# vim gluster-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: gluster
  labels:
   type: glusterfs
spec:
  capacity:
   storage: 50Gi
  accessModes:
   - ReadWriteMany
  glusterfs:
   endpoints: "glusterfs"
   path: "jackie"
   readOnly: false

启动服务
# kubectl create -f  gluster-pv.yaml

查看卷
# gluster volume list
jackie

# kubectl get pv
gluster   50Gi       RWX           Retain 


创建gluste的PVC配置文件
-----------------------
# cp ../volume/test-pvc.yaml .
# mv test-pvc.yaml  glusterfs-pvc.yaml
# vim glusterfs-pvc.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: gluster
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 50Gi
      
 启动PVC服务
# kubectl create -f  glusterfs-pvc.yaml 


查看结果
# kubectl get pv
gluster   50Gi    Bound   default/gluster 
# kubectl get pvc
gluster   Bound     gluster   50Gi     



1.2.3、实现nginx服务存储

# cp ../pod/nginx_pod.yaml  .
# vim nginx_pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: web
    env: rest
spec:
  containers:
    - name: nginx
      image: 10.0.0.6:5000/nginx:1.13
      ports:
        - containerPort: 80
      volumeMounts:
        - name: nfs-vol2
          mountPath: /usr/share/nginx/html
  volumes:
  - name: nfs-vol2
    persistentVolumeClaim:
      claimName: gluster
      
启动服务
# kubectl create -f nginx_pod.yaml


# kubectl get pods
nginx             1/1       Running   
# kubectl get pods -o wide
nginx   Running  172.16.12.4   k8s-master01




添加一个关键字hostPort,它可以直接docker 映射了,把宿主机的什么端口映射到容器的什么端口了,使用宿主机80端口
# kubectl delete -f nginx_pod.yaml
# kubectl create -f nginx_pod.yaml
apiVersion: v1
kind: Pod
metadata:        #meta 自称的
  name: nginx
  labels:
    app: web
    env: rest
spec:
  containers:
    - name: nginx
      image: 10.0.0.6:5000/nginx:1.13
      ports:
        - containerPort: 80
          hostPort: 80
      volumeMounts:
        - name: nfs-vol2
          mountPath: /usr/share/nginx/html
  volumes:
  - name: nfs-vol2
    persistentVolumeClaim:
      claimName: gluster      #claim 自称
      

# kubectl get pod -o wide
nginx  Running   172.16.12.4   k8s-master01

2.0、ubuntu

2.1、 glusterfs扩容存储

2.1.1、glusterfs安装

sudo apt-get install software-properties-common
sudo add-apt-repository ppa:gluster/glusterfs-3.8 && sudo apt-get update
sudo apt-get install glusterfs-server
分布式文件管理系统glusterfs
glusterfs是个开源分布式文件管理系统,具有较强的横向扩展功能,
可以支持PB存储容量和数千客户端。通过网络互联成为一个并行的网络文件系统。具有高性能,扩展性,高可用性。

172.31.7.201-master  172.31.7.207-node1  172.31.7.208-node2
------------------------------------------------------------
# yum install centos-release-gluster  glusterfs-server  -y
# systemctl start glusterd.service   && systemctl enable glusterd.service
# mkdir -p /gfs/test1  && mkdir -p /gfs/test2


10.0.0.6-master
---------------
所有节点加入资源池
# gluster pool list
# gluster peer probe k8s-node01
# gluster peer probe k8s-node02


创建分布式复制卷
gluster volume create jackie replica 2 k8s-master01:/gfs/test1 k8s-master01:/gfs/test2 k8s-node01:/gfs/test1 k8s-node01:/gfs/test2 force

启动卷
gluster volume start jackie

查看卷
gluster volume info jackie

挂载卷
mount -t glusterfs 10.0.0.6:/jackie   /mnt

再创建一个node节点后,格式化后把新节点的Brick加入资源池的卷中,每次至少加两个



分布式复制卷扩容
扩容前查看容量:
df -h 
10.0.0.6:/jackie      199G  5.7G  194G    3% /mnt                #添加磁盘

扩容命令:
# gluster volume add-brick jackie k8s-node02:/gfs/test1 k8s-node02:/gfs/test2 force

扩容后查看容器:
df -h 
10.0.0.6:/jackie      299G  8.0G  291G    3% /mnt

测试:
# cd /mnt/  &&  unzip xiaoniaofeifei.zip
# ls
2000.png 21.js icon.png index.html

2.2 、glusterfs做后端存储


Jenkins自动化

1.1、gitlab安装

image-20210608162535593

10.0.0.8-node2
---------------
#安装依赖
yum install -y curl policycoreutils-python openssh-server postfix

#开启ssh访问,设置开机启动
systemctl start sshd
systemctl enable sshd

#关闭防火墙,关闭开机启动
systemctl stop firewalld
systemctl disable firewalld

#开启Postfix发送通知邮件
systemctl start postfix
systemctl enable postfix


二、rpm安装
rpm安装包下载地址:[清华开源网站镜像](https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/)
这里选择 `gitlab-ce-13.5.4-ce.0.el7.x86_64.rpm`
#  rpm -ivh gitlab-ce-13.5.4-ce.0.el7.x86_64.rpm

三、修改gitlab配置
修改域名
vim /etc/gitlab/gitlab.rb
external_url 'http://10.0.0.8'            #修改如下,端口号自己定义,不冲突就行
 /# prometheus_monitoring['enable'] = true
 改:  prometheus_monitoring['enable'] = false
 
更新配置
gitlab-ctl reconfigure

查看状态
gitlab-ctl status

重启gitlab
gitlab-ctl restart

四、浏览器输入`ip:port`

五、设置登录密码

六、登录(默认用户名:`root`,密码:`同上`)

1.2、gitlab代码部署

Image 100

10.0.0.8-node2
--------------
上传到linux中代码文件
# cd /opt/  && cd  jackie 
# unzip jetbrains-agent-latest.zip

配置gitlab
git config --global user.name "Administrator"
git config --global user.email "admin@example.com"

初始化gitlab仓库
git init
git remote add origin http://10.0.0.8/root/jackie.git
git add .
git commit -m "Initial commit"
git push -u origin master

上传到代码从Linux中上传到gitlab
# git push -u origin master
Username for 'http://10.0.0.8': root
Password for 'http://root@10.0.0.8': 12345678

1.3、安装Jenkins

k8s-node01上安装
-------------------
安装jenkins
安装jdk
# rpm -ivh jdk-8u102-linux-x64.rpm
2:安装tomcat
# tar xf apache-tomcat-8.0.27.tar.gz-C /app
3:安装jenkins
# mv jenkins.war /app/apache-tomcat-8.0.27/webapps/ROOT.war

helm部署

1.1 helm简介图

image-20210709095742470

1.1.1、helm简介

helm: 
helm: 命令行客户端工具,利用helm在kebe cluster上安装部署程序,支持自动更新机制于回滚
Chart: 清单配置文件组合,有官方的chart仓库
tiller: 它是helm守护进程,helm把请求转发给t了,t了去连接API server,在由API server完成创建
release: 它是t了资源管理对象
chart --> config --> release
Api server
kube cluster 集群

helm: 
   核心术语
Chart: 一个helm程序包;     恰s
Repository: Charts仓库,https/http服务器;
Release: 特定的Chart部署于目标集群上的一个实例;
Chart -> Config -> Release

程序架构:
helm: 客户端,管理本地的Chart仓库,管理Chart,与Tiller服务器交互,发送Chart,实例安装、查询、卸载等操作
Tiller: 服务端

https://github.com/helm/helm/releases

1.1.0、helm命令集合

helm version
kubectl get sa -n kube-system
kubectl get pods -n kube-system
kubectl get pod --all-namespaces
kubectl get all --all-namespaces | grep tiller 
kubectl get all -n kube-system -l app=helm -o name|xargs kubectl delete -n kube-system
watch kubectl get pod -n kube-system -o wide

1.2、helm安装

172.31.7.201
-------------
下载,wget或者迅雷下载再传上都可以
https://get.helm.sh/helm-v2.16.9-linux-amd64.tar.gz
tar -zxvf helm-v2.16.9-linux-amd64.tar.gz
cp linux-amd64/helm /usr/bin
#cp linux-amd64/tiller /usr/local/bin


检查
[root@server1 ~]# helm version                
Client: &version.Version{SemVer:"v2.16.9", GitCommit:"8ad7037828e5a0fca1009dabe290130da6368e39", GitTreeState:"clean"}
Error: could not find tiller

1.3、tiller部署

172.31.7.201
--------------
mkdir manifests   &&  cd manifests  && mkdir helm  &&  cd helm
[root@server1 helm]# vim tiller-rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: tiller
  namespace: kube-system
---
apiVersion:  rbac.authorization.k8s.io/v1        ------> 主要配置
kind: ClusterRoleBinding
metadata:
  name: tiller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: tiller
    namespace: kube-system


[root@server1 helm]# kubectl apply -f tiller-rbac.yaml 
serviceaccount/tiller created
clusterrolebinding.rbac.authorization.k8s.io/tiller created

1.3.1、查看创建结果

[root@server1 helm]# kubectl get sa -n kube-system
tiller                               1         2m12s        创建成功tiller账号

1.3.2、初始化仓库

[root@server1 helm]# helm init \
> --upgrade \
> --service-account=tiller \
> --tiller-image=registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.16.9 \
> --history-max 300

1.3.2.0、初始化结果

$HELM_HOME has been configured at /root/.helm.    ------->  已经安装在集群中

Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.

Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy. 
To prevent this, run `helm init` with the --tiller-tls-verify flag.
For more information on securing your installation see: https://v2.helm.sh/docs/securing_installation/
                                                           -------> 安装成功后pod中就会多一个title服务
                                                           

1.3.2.1、tiller运作状态

# kubectl get pods -n kube-system   
tiller-deploy-6cbb7bc8f4-ls7j5    1/1     Running   0          8m8s



# kubectl describe pod  tiller-deploy-6cbb7bc8f4-ls7j5 -n kube-system
Events:
  Type    Reason     Age    From               Message
  ----    ------     ----   ----               -------
  Normal  Scheduled  9m7s   default-scheduler  Successfully assigned kube-system/tiller-deploy-6cbb7bc8f4-ls7j5 to node2
  Normal  Pulling    9m6s   kubelet            Pulling image "registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.16.9"
  Normal  Pulled     8m10s  kubelet            Successfully pulled image "registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.16.9" in 56.527313582s
  Normal  Created    8m9s   kubelet            Created container tiller
  Normal  Started    8m9s   kubelet            Started container tiller



# kubectl get all --all-namespaces |grep tiller
kube-system            pod/tiller-deploy-6cbb7bc8f4-ls7j5               1/1     Running   0          11m
kube-system            service/tiller-deploy               ClusterIP   10.200.76.54    <none>        44134/TCP                11m
kube-system            deployment.apps/tiller-deploy               1/1     1            1           11m
kube-system            replicaset.apps/tiller-deploy-6cbb7bc8f4               1         1         1       11m


[root@server1 helm]# helm version
Client: &version.Version{SemVer:"v2.16.9", GitCommit:"8ad7037828e5a0fca1009dabe290130da6368e39", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.16.9", GitCommit:"8ad7037828e5a0fca1009dabe290130da6368e39", GitTreeState:"clean"}

1.4、helm使用

1.4.1、helm命令

helm search     列出仓库所有的可用的charts
helm repo list       列出可用的仓库
helm install  jenkins
helm install dandydev/redis-ha       下载高可用版本
helm inspect stable/jenkins    查看jenkins配置信息

列出仓库所有的可用的charts
# helm search     
# helm search    jenkins 

查看jenkins配置信息
# helm inspect stable/jenkins  

部署项目
# helm install --name mem1 stable/memcached   

卸载资源
helm delete mem1
helm delete redis1
helm del --purge redis2

滚动更新
helm repo update
helm repo index  --url=http:/10.136.81.51:8879/   /home/jenkins/.helm/repository/local/
helm upgrade cctv-cndms(自建清单名)  yszq-yfb-repo/cctv-cndms(仓库清单charts)  

列出存在的项目清单
helm  list

打包
helm  package   /home/jenkins/kubernetes/cndms-chart-master/cctv-cndms  --debug

部署历史
helm history redis1

获取部署信息
helm status redis1
helm ls --all redis2

1.4.2、helm使用

https://hub.kubeapps.com/charts/datawire/ambassador
helm repo update
helm search  jenkins    
helm install  jenkins
helm install dandydev/redis-ha       下载高可用版本

helm repo list       列出可用的仓库
NAME    URL                          
local   http://127.0.0.1:8879/charts 
stable  https://charts.helm.sh/stable

# helm search     列出仓库所有的可用的charts
stable/weave-scope                      1.1.12          1.12.0                  DEPRECATED - A Helm chart for the Weave Scope cluster vis...
stable/wordpress                        9.0.3           5.3.2                   DEPRECATED Web publishing platform for building blogs and...
stable/xray                             0.4.3           2.3.0                   DEPRECATED Universal component scan for security and lice...
stable/zeppelin                         1.1.3           0.7.2                   DEPRECATED - Web-based notebook that enables data-driven,...
stable/zetcd                            0.1.11          0.0.3                   DEPRECATED CoreOS zetcd Helm chart for Kubernetes     

# helm search  jenkins                                   
stable/jenkins  2.5.4           lts             DEPRECATED - Open source continuous integration server. I...
  

# helm search memcache                                                
stable/memcached        3.2.5           1.5.20          DEPRECATED - Free & open source, high-performance, distri...
stable/mcrouter         1.0.6           0.36.0          DEPRECATED - Mcrouter is a memcached protocol router for ...


1.4.2.1、helm安装redis

[root@server1 ]# helm search redis
NAME                                    CHART VERSION   APP VERSION    DESCRIPTION                                                 
stable/prometheus-redis-exporter        3.5.1           1.3.4          DEPRECATED Prometheus exporter for Redis metrics            
stable/redis                            10.5.7          5.0.7          DEPRECATED Open source, advanced key-value store. It is o...
stable/redis-ha                         4.4.6           5.0.6          DEPRECATED - Highly available Kubernetes implementation o...
stable/sensu                            0.2.5           0.28           DEPRECATED Sensu monitoring framework backed by the Redis...


[root@server1 helm]# helm install --name redis1 stable/redis 
NAME:   redis1
LAST DEPLOYED: Sat Jul 10 14:11:00 2021
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/ConfigMap
NAME           DATA  AGE
redis1         3     2s
redis1-health  6     2s

==> v1/Pod(related)
NAME             READY  STATUS   RESTARTS  AGE
redis1-master-0  0/1    Pending  0         0s
redis1-slave-0   0/1    Pending  0         0s

==> v1/Secret
NAME    TYPE    DATA  AGE
redis1  Opaque  1     1s

==> v1/Service
NAME             TYPE       CLUSTER-IP     EXTERNAL-IP  PORT(S)   AGE
redis1-headless  ClusterIP  None           <none>       6379/TCP  2s
redis1-master    ClusterIP  10.200.248.64  <none>       6379/TCP  1s
redis1-slave     ClusterIP  10.200.32.46   <none>       6379/TCP  1s

==> v1/StatefulSet
NAME           READY  AGE
redis1-master  0/1    1s
redis1-slave   0/2    1s


NOTES:
This Helm chart is deprecated

Given the `stable` deprecation timeline (https://github.com/helm/charts#deprecation-timeline), the Bitnami maintained Redis Helm chart is now located at bitnami/charts (https://github.com/bitnami/charts/).

The Bitnami repository is already included in the Hubs and we will continue providing the same cadence of updates, support, etc that we've been keeping here these years. Installation instructions are very similar, just adding the _bitnami_ repo and using it during the installation (`bitnami/<chart>` instead of `stable/<chart>`)

​```bash
$ helm repo add bitnami https://charts.bitnami.com/bitnami
$ helm install my-release bitnami/<chart>           # Helm 3
$ helm install --name my-release bitnami/<chart>    # Helm 2
​```

To update an exisiting _stable_ deployment with a chart hosted in the bitnami repository you can execute
 ```bash                                                                                                                              $ helm
 repo add bitnami https://charts.bitnami.com/bitnami
  $ helm upgrade my-release bitnami/<chart>
 Issues and PRs related to the chart itself will be redirected to `bitnami/charts` GitHub repository. In the same way, we'll be happy to answer questions related to this migration process in this issue (https://github.com/helm/charts/issues/20969) created as a common place for discussion.

** Please be patient while the chart is being deployed **
Redis can be accessed via port 6379 on the following DNS names from within your cluster:

redis1-master.default.svc.cluster.local for read/write operations
redis1-slave.default.svc.cluster.local for read-only operations


To get your password run:
export REDIS_PASSWORD=$(kubectl get secret --namespace default redis1 -o jsonpath="{.data.redis-password}" | base64 --decode)             ---------> 执行括号内命令,获取随机密码
To connect to your Redis server:

1. Run a Redis pod that you can use as a client:

   kubectl run --namespace default redis1-client --rm --tty -i --restart='Never' \
    --env REDIS_PASSWORD=$REDIS_PASSWORD \
   --image docker.io/bitnami/redis:5.0.7-debian-10-r32 -- bash

2. Connect using the Redis CLI:
   redis-cli -h redis1-master -a $REDIS_PASSWORD
   redis-cli -h redis1-slave -a $REDIS_PASSWORD

To connect to your database from outside the cluster execute the following commands:
kubectl port-forward --namespace default svc/redis1-master 6379:6379 &
redis-cli -h 127.0.0.1 -p 6379 -a $REDIS_PASSWORD                                                                                                                                                                                  

1.4.2.2、检查redis状态

# kubectl get pods
NAME              READY   STATUS    RESTARTS   AGE
net-test1         1/1     Running   1          16h
net-test2         1/1     Running   1          16h
redis1-master-0   0/1     Pending   0          3m29s
redis1-slave-0    0/1     Pending   0          3m29s


# kubectl describe pod redis1-master-0  
Events:
  Type     Reason            Age   From               Message

----     ------            ----  ----               -------

  Warning  FailedScheduling  5m1s  default-scheduler  0/4 nodes are available: 4 pod has unbound immediate PersistentVolumeClaims.             ------->  未绑定本地存储卷pv与pvc
  Warning  FailedScheduling  5m1s  default-scheduler  0/4 nodes are available: 4 pod has unbound immediate PersistentVolumeClaims.             ------->  未绑定本地存储卷pv与pvc
  Warning  FailedScheduling  108s  default-scheduler  0/4 nodes are available: 4 pod has unbound immediate PersistentVolumeClaims.             ------->  未绑定本地存储卷pv与pvc

1.4.2.3、安装包存在位置

# cd /root/.helm/cache/archive/

[root@server1 archive]# ls
jenkins-2.5.4.tgz  memcached-3.2.5.tgz  redis-10.5.7.tgz

[root@server1 archive]# tar xvf jenkins-2.5.4.tgz  && cd  jenkins
[root@server1 jenkins]# tree
.
├── CHANGELOG.md
├── Chart.yaml
├── OWNERS
├── README.md
├── templates                    ------> 模板
│   ├── config.yaml
│   ├── deprecation.yaml
│   ├── _helpers.tpl
│   ├── home-pvc.yaml
│   ├── jcasc-config.yaml
│   ├── jenkins-agent-svc.yaml
│   ├── jenkins-backup-cronjob.yaml
│   ├── jenkins-backup-rbac.yaml
│   ├── jenkins-master-alerting-rules.yaml
│   ├── jenkins-master-backendconfig.yaml
│   ├── jenkins-master-deployment.yaml
│   ├── jenkins-master-ingress.yaml
│   ├── jenkins-master-networkpolicy.yaml
│   ├── jenkins-master-route.yaml
│   ├── jenkins-master-servicemonitor.yaml
│   ├── jenkins-master-svc.yaml
│   ├── jobs.yaml
│   ├── NOTES.txt
│   ├── rbac.yaml
│   ├── secret-https-jks.yaml
│   ├── secret.yaml
│   ├── service-account-agent.yaml
│   ├── service-account.yaml
│   └── tests
│       ├── jenkins-test.yaml
│       └── test-config.yaml
└── values.yaml

2 directories, 30 files

1.4.2.4、redis配置并启动

删除原来的redis
helm delete redis1
helm del --purge redis2
helm ls --all redis2

解压包
[root@server1 archive]# ls  &&  tar xvf redis-10.5.7.tgz 
jenkins            memcached-3.2.5.tgz  redis-10.5.7.tgz
jenkins-2.5.4.tgz  redis


修改配置文件
[root@server1 archive]# pwd
/root/.helm/cache/archive
[root@server1 archive]# cd redis/ &&  cp values.yaml  /root/manifests/helm/
[root@server1 redis]# vim  /root/manifests/helm/values.yaml     ---->修改配置文件参数
 pullPolicy: IfNotPresent
 cluster:
  enabled: false                ----->主要配置
  slaveCount: 2
196 usePassword: true           ----->主要配置
503   podAnnotations:
504     prometheus.io/scrape: "true"     ----->主要配置
505     prometheus.io/port: "9121"


启动服务
cd /root/manifests/helm/ && helm install --name redis1 -f values.yaml stable/redis
posted @   Jackiezhu  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示