1:k8s集群的安装

1.1 k8s的架构

在这里插入图片描述

Master:
API-Server 核心服务
Controller Manager 监控容器的状态实现自愈功能
Scheduler 调度器:挑选合适的节点创建容器
etcd  数据库
node:
kubelet 通过docker创建容器
cadvisor 普罗米修斯监控容器
pod  每个容器都被封装到pod资源里
Kube-Proxy  负载均衡
网络插件:flannel容器之间跨宿主机通讯,将ip地址分配信息自动写入etcd中

除了核心组件,还有一些推荐的Add-ons:

组件名称说明
kube-dns负责为整个集群提供DNS服务
Ingress Controller为服务提供外网入口
Heapster提供资源监控
Dashboard提供GUI
Federation提供跨可用区的集群
Fluentd-elasticsearch提供集群日志采集、存储与查询

1.2 修改IP地址、主机名和host解析

10.0.0.11  k8s-master
10.0.0.12  k8s-node-1
10.0.0.13  k8s-node-2

所有节点需要做hosts解析

1.3 master节点安装etcd(数据库服务)

第一步:安装数据库服务
[root@k8s-master ~]# yum install etcd -y
第二步:编辑配置文件
[root@k8s-master ~]# vim /etc/etcd/etcd.conf
6行:ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"    #监听什么地址
21行:ETCD_ADVERTISE_CLIENT_URLS="http://10.0.0.11:2379"
第三步:启动服务
[root@k8s-master ~]# systemctl start etcd.service 
[root@k8s-master ~]# systemctl enable etcd.service 
第四步:测试etcd集群监控状态
[root@k8s-master ~]# etcdctl set testdir/testkey0 0
[root@k8s-master ~]# etcdctl get testdir/testkey0
[root@k8s-master ~]# etcdctl -C http://10.0.0.11:2379 cluster-health

etcd原生支持做集群,

1.4 master节点安装kubernetes

第一步:安装服务
[root@k8s-master ~]# yum install -y kubernetes-master.x86_64
第二步:编写配置文件
[root@k8s-master ~]# vim /etc/kubernetes/apiserver 
8行:  KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0" #api-server监听的地址
11行:KUBE_API_PORT="--port=8080"  #api-server监听的端口
14行: KUBELET_PORT="--kubelet-port=10250"  #监听服务端的端口
17行:KUBE_ETCD_SERVERS="--etcd-servers=http://10.0.0.11:2379" #etcd集群的地址,若多个,用“,”隔开再写
23行:KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota" 

[root@k8s-master ~]# vim /etc/kubernetes/config
22行:KUBE_MASTER="--master=http://10.0.0.11:8080" #KUBE_MASTER==api-server
第三步:重启服务
[root@k8s-master ~]# systemctl enable kube-apiserver.service 
[root@k8s-master ~]# systemctl restart kube-apiserver.service 
[root@k8s-master ~]# systemctl enable kube-controller-manager.service 
[root@k8s-master ~]# systemctl restart kube-controller-manager.service 
[root@k8s-master ~]# systemctl enable kube-scheduler.service 
[root@k8s-master ~]# systemctl restart kube-scheduler.service 

检查服务是否安装正常

[root@k8s-master ~]# kubectl get componentstatus 
NAME                 STATUS    MESSAGE             ERROR
etcd-0               Healthy   {"health":"true"}   
scheduler            Healthy   ok                  
controller-manager   Healthy   ok   

1.5 node节点安装kubernetes

第一步:安装服务(会自动安装docker)
[root@k8s-node-1 ~]# yum install kubernetes-node.x86_64 -y
第二步:编辑配置文件
[root@k8s-node-1 ~]# vim /etc/kubernetes/config 
22行:KUBE_MASTER="--master=http://10.0.0.11:8080" #api-server节点

[root@k8s-node-1 ~]# vim /etc/kubernetes/kubelet
5行:KUBELET_ADDRESS="--address=0.0.0.0" #监听的地址(所有)
8行:KUBELET_PORT="--port=10250"  #监听的端口
11行:KUBELET_HOSTNAME="--hostname-override=k8s-node-1" #这个hostname必须唯一(可以用ip),必须可以被解析
14行:KUBELET_API_SERVER="--api-servers=http://10.0.0.11:8080"
第三步:重启服务
[root@k8s-node-1 ~]# systemctl enable kubelet.service
[root@k8s-node-1 ~]# systemctl restart kubelet.service #会先启动docker
[root@k8s-node-1 ~]# systemctl enable kube-proxy.service
[root@k8s-node-1 ~]# systemctl restart kube-proxy.service
[root@k8s-master ~]# kubectl get node 
NAME         STATUS    AGE
k8s-node-1   Ready     7m
k8s-node-2   Ready     7m
删除:[root@k8s-master ~]# kubectl delete node 10.0.0.13(hostname)

1.6 所有节点配置flannel网络

第一步:在所有节点安装flannel
[root@k8s-master ~]# yum install flannel -y
[root@k8s-master ~]# sed -i 's#http://127.0.0.1:2379#http://10.0.0.11:2379#g' /etc/sysconfig/flanneld
第二步:在master节点:
[root@k8s-master ~]# etcdctl mk /atomic.io/network/config   '{ "Network": "172.18.0.0/16" }'

[root@k8s-master ~]# yum install docker -y
[root@k8s-master ~]# systemctl enable flanneld.service 
[root@k8s-master ~]# systemctl restart flanneld.service 
[root@k8s-master ~]# systemctl  restart  docker
[root@k8s-master ~]# systemctl  enable  docker
[root@k8s-master ~]# systemctl restart kube-apiserver.service
[root@k8s-master ~]# systemctl restart kube-controller-manager.service
[root@k8s-master ~]# systemctl restart kube-scheduler.service
第三步:在node节点:
[root@k8s-node-1 ~]# systemctl enable flanneld.service 
[root@k8s-node-1 ~]# systemctl restart flanneld.service 
[root@k8s-node-1 ~]# systemctl  restart  docker
[root@k8s-node-1 ~]# systemctl restart kubelet.service
[root@k8s-node-1 ~]# systemctl restart kube-proxy.service
第四步:所有节点添加防火墙开放规则实现容器之间跨宿主机通讯
[root@k8s-node-1 ~]# vim /usr/lib/systemd/system/docker.service
#在[Service]区域下增加一行
ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT
[root@k8s-node-1 ~]# systemctl daemon-reload 
[root@k8s-node-1 ~]# systemctl restart docker
测试所有节点:
[root@k8s-master ~]# docker load -i docker_alpine.tar.gz 
[root@k8s-master ~]# docker run -it alpine:latest 
[root@k8s-master ~]# iptables -P FORWARD ACCEPT  #一次性开放防火墙规则就可以成功ping通所有
永久生效:
[root@k8s-node-1 ~]# vim /usr/lib/systemd/system/docker.service
#在[Service]区域下增加一行
ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT
解释:
Systemd
[services]
ExecStartPre=启动之前执行的命令
ExecStart=启动服务的命令
ExecStartPost=启动之后执行的命令

1.7 配置master为镜像仓库

#所有节点
[root@k8s-master ~]# vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["10.0.0.11:5000"]
}
[root@k8s-master ~]# systemctl restart docker
#master节点
[root@k8s-master ~]# docker load -i registry.tar.gz
[root@k8s-master ~]# docker run -d -p 5000:5000 --restart=always --name registry -v /opt/myregistry:/var/lib/registry  registry
上传镜像到仓库:
[root@k8s-node-2 ~]# docker tag alpine:latest  10.0.0.11:5000/alpine:latest
[root@k8s-node-2 ~]# docker push 10.0.0.11:5000/alpine:latest 
上传pod-infrastructure:latest和nginx:1.13镜像到私有仓库
删除镜像:https://oldqiang.com/archives/350.html

2:什么是k8s,k8s有什么功能?

k8s是一个docker集群的管理工具
k8s是容器的编排工具 通过yml文件

2.1 k8s的核心功能

自愈: 重新启动失败的容器,在节点不可用时,替换和重新调度节点上的容器,对用户定义的健康检查不响应的容器会被中止,并且在容器准备好服务之前不会把其向客户端广播。

弹性伸缩: 通过监控容器的cpu的负载值,如果这个平均高于80%,自动增加容器的数量,如果这个平均低于10%,减少容器的数量(web服务器)

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

滚动升级和一键回滚: Kubernetes 逐渐部署对应用程序或其配置的更改,同时监视应用程序运行状况,以确保它不会同时终止所有实例。 如果出现问题,Kubernetes会为您恢复更改,利用日益增长的部署解决方案的生态系统。(web)
私密配置文件管理. web容器里面,数据库的账户密码(测试库密码)

2.2 k8s的历史

2014年 docker容器编排工具,立项
2015年7月 发布kubernetes 1.0, 加入cncf基金会 孵化
2016年,kubernetes干掉两个对手,docker swarm,mesos marathon 1.2版
2017年 1.5 -1.9
2018年 k8s 从cncf基金会 毕业项目1.10 1.11 1.12
2019年: 1.13, 1.14 ,1.15,1.16 1.17
cncf :cloud native compute foundation 孵化器
kubernetes (k8s): 希腊语 舵手,领航者 容器编排领域,
谷歌15年容器使用经验,borg容器管理平台,使用golang重构borg,kubernetes

2.3 k8s的安装方式

yum安装 1.5 最容易安装成功,最适合学习的
源码编译安装—难度最大 可以安装最新版
二进制安装—步骤繁琐 可以安装最新版 shell,ansible,saltstack https://github.com/easzlab/kubeasz
kubeadm 安装最容易, 网络 可以安装最新版
minikube 适合开发人员体验k8s, 网络

2.4 k8s的应用场景

k8s最适合跑微服务项目!

软件开发架构:
1)MVC架构:

[秒杀] (https:/ /www.jd.com/miaosha
[优惠券] (https:/ /www.jd.com/a
[PLUS会员] (https:/ /www.jd.com/plus
[品牌闪购] (https: / /www.jd.com/ red
[拍卖] (https:/ /www.jd.com/paimai
[京东家电] (https: / /www.jd.com/jiadian
[京东超市] (https: / /www.jd.com/ chaoshi
只有一个域名,只能运行在一个集群,只能承受几百万并发

2)微服务架构:

[秒杀] (https://miaosha.jd.com/
[优惠券] (https://a.jd.com/
[PLUS会员] (https://plus.jd.com/
[品牌闪购] (https://red.jd.com/
[拍卖] (https://paimai.jd.com/
[京东家电] (https://jiadian.jd.com/
[京东超市] (https: //chaoshi.jd.com/
有N多个域名,运行在N套集群.上面,几十亿并发

微服务好处:支持更大的并发,健壮性更好,代码发布更快,对开发人员的要求更低
上了微服务之后,至少管理儿十个服务,使用docker解决服务快速部署的问题

#启动四联
systemctl restart flanneld.service 
systemctl restart docker
systemctl restart kubelet.service 
systemctl restart kube-proxy.service 

3:k8s常用的资源

3.1 创建pod资源

pod是最小资源单位.(最少包含两个容器:基础容器和多个业务容器)基础容器来实现k8s高级功能
任何的一个k8s资源都可以由yml清单文件来定义
k8s yaml的主要组成(可以顶格写)

apiVersion: v1     api版本
kind: pod          资源类型
metadata:          资源属性
spec:              详细
第一步:先创建存放pod文件的目录
[root@k8s-master ~]# mkdir /root/k8s-yaml/pod -p
[root@k8s-master ~]# cd /root/k8s-yaml/pod
第二步:编写pod文件
[root@k8s-master pod]# vi k8s_pod.yml  #pod名称必须唯一
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: web
spec:
  containers:
    - name: nginx
      image: 10.0.0.11:5000/nginx:1.13
      ports:
        - containerPort: 80
##创建容器
[root@k8s-master pod]# kubectl create -f k8s_pod.yml 
##查看有哪些pod
[root@k8s-master pod]# kubectl get pods  #一直不是running状态出问题
NAME      READY     STATUS              RESTARTS   AGE
nginx     0/1       ContainerCreating   0          9m
[root@k8s-master pod]# kubectl describe pod nginx   #k8s用的最多的排查命令

node节点**(所有节点都需要修改)**

由上一条命令发现node-2节点出现问题,修改node-2节点
[root@k8s-node-2 ~]# vim /etc/kubernetes/kubelet
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=10.0.0.11:5000/pod-infrastructure:latest"
[root@k8s-node-2 ~]# systemctl restart kubelet.service 
[root@k8s-master pod]# kubectl get pods   #成功运行
NAME      READY     STATUS    RESTARTS   AGE
nginx     1/1       Running   0          17m

pod资源:至少由两个容器组成,pod基础容器和业务容器组成(最多1+4)
pod配置文件2:

[root@k8s-master pod]# /root/k8s-yaml/pod/k8s_pod2.yml #一个基础容器+两个业务容器
apiVersion: v1
kind: Pod
metadata:
  name: test
  labels:
    app: web
spec:
  containers:
    - name: nginx
      image: 10.0.0.11:5000/nginx:1.13
      ports:
        - containerPort: 80
    - name: alpine
      image: 10.0.0.11:5000/alpine:latest
      command: ["sleep","1000"]
[root@k8s-master pod]# kubectl create -f k8s_pod2.yml 
[root@k8s-master pod]# kubectl get pod
[root@k8s-master pod]# kubectl get pod -o wide
NAME      READY     STATUS    RESTARTS   AGE       IP            NODE
nginx     1/1       Running   0          1h        172.18.40.3   k8s-node-2
test      2/2       Running   0          1m        172.18.93.3   k8s-node-1

pod是k8s最小的资源单位

3.2 ReplicationController资源

rc:保证指定数量的pod始终存活,rc通过标签选择器来关联pod,每个标签选择器(selector)是唯一
注意:
1.手动创建的pod当一个节点宕机,则死亡不会恢复,由rc创建会自动恢复
2.rc与pod关联是因为标签选择器,所以每个rc的标签选择器声明的标签不能相同

k8s资源的常见操作:

kubectl create -f xxx.yaml   创建资源(声明文件位置)
kubectl get pod|rc|node(资源类型)  查看
kubectl describe pod nginx       查看资源的详情描述
kubectl delete  pod(资源类型) nginx(资源名称)或者 kubectl delete  -f  xxx.yaml 
kubectl edit pod  nginx  修改资源属性
-o wide  查看详细
--show-labels 查看标签

创建一个rc

[root@k8s-master rc]# cat /root/k8s_yaml/rc/k8s_rc.yml 
apiVersion: v1
kind: ReplicationController      #资源类型rc
metadata:
  name: nginx
spec:
  replicas: 5     #副本5,5个一模一样的pod,名字不同
  selector:
    app: myweb     #标签选择器声明标签*
  template:       #pod模板
    metadata:
      labels:
        app: myweb    #贴上一个rc标签*
    spec:
      containers:
      - name: myweb
        image: 10.0.0.11:5000/nginx:1.13
        ports:
        - containerPort: 80
[root@k8s-master rc]# kubectl create -f k8s_rc.yml 

rc的滚动升级 新建一个nginx-rc1.15.yaml
在这里插入图片描述
升级:kubectl rolling-update nginx -f nginx-rc1.15.yaml --update-period=10s
回滚:kubectl rolling-update nginx2 -f nginx-rc.yaml --update-period=1s
查看内核转发参数:sysctl -a |grep ipv4.ip_forward

3.3 service资源

service帮助pod暴露端口
创建一个service

[root@k8s-master svc]# cat /root/k8s_yaml/svc/k8s_svc.yml
apiVersion: v1
kind: Service   #简称svc
metadata:
  name: myweb
spec:
  type: NodePort  #默认ClusterIP
  ports:
    - port: 80          #clusterIP
      nodePort: 30000   #node port
      targetPort: 80    #pod port
  selector:
    app: myweb2
[root@k8s-master svc]# kubectl create -f k8s_svc.yml 
访问10.0.0.12:30000/10.0.0.13:30000
调整rc的副本数方法一:kubectl edit rc nginx2
调整rc的副本数方法二:kubectl scale rc nginx --replicas=2
进入pod容器:kubectl  exec  -it   pod_name  /bin/bash   再去修改两个容器的首页
若pod里面有多个容器:kubectl exec --container=myweb -it nginx2-x7bvd /bin/bash
[root@k8s-master svc]# curl 10.0.0.12:30000
web01
[root@k8s-master svc]# curl 10.0.0.12:30000
web02
[root@k8s-master svc]# curl 10.0.0.13:30000
web01
[root@k8s-master svc]# curl 10.0.0.13:30000
web02

修改nodePort范围

[root@k8s-master ~]# vim /etc/kubernetes/apiserver
KUBE_API_ARGS="--service-node-port-range=3000-50000"
[root@k8s-master ~]# systemctl restart kube-apiserver.service 

命令行创建service资源(端口随机)

kubectl expose rc nginx --type=NodePort --port=80 --target-port=80

service默认使用iptables来实现负载均衡, k8s 1.8新版本中推荐使用lvs(四层负载均衡 传输层tcp,udp) [root@k8s-node-1 ~]# iptables -t nat -L -n

3.4 deployment资源

有rc在滚动升级之后,会造成服务访问中断,于是k8s引入了deployment资源

rc:滚动升级之后,服务访问中断,rc滚动升级依赖配置文件,修改了配置文件不是立即生效
deploynnet:滚动升级之后,服务访问不中断,滚动升级不依赖配置文件,修改了配置文件立即生效
创建deployment

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  minReadySeconds: 30
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: 10.0.0.11:5000/nginx:1.13
        ports:
        - containerPort: 80
        resources:  
          limits:
            cpu: 100m
          requests:
            cpu: 100m

deployment升级和回滚

1)命令行创建deployment

kubectl run nginx --image=10.0.0.11:5000/nginx:1.13 --replicas=3 --record

2)命令行升级版本

kubectl set image deployment(资源类型) nginx(资源名称) nginx(容器名称)=10.0.0.11:5000/nginx:1.15

3)查看deployment所有历史版本

kubectl rollout history deployment nginx

4)deployment回滚到上一个版本

kubectl rollout undo deployment nginx

5)deployment回滚到指定版本

kubectl rollout undo deployment nginx --to-revision=2

maxSurge:升级过程中最多可以比原先设置多出的POD数量
    例如:maxSurage=1,replicas=5,则表示Kubernetes会先启动一个新的Pod后才删掉一个旧的POD,整个升级过程中最多会有5+1个POD。
maxUnavaible:升级过程中最多有多少个POD处于无法提供服务的状态
    当maxSurge不为0时,该值也不能为0
    例如:maxUnavaible=1,则表示Kubernetes整个升级过程中最多会有1个POD处于无法服务的状态。

3.5 tomcat+mysql练习

在k8s中容器之间相互访问,通过VIP地址!
在这里插入图片描述

上传yml文件
上传镜像
[root@k8s-master tomcat_demo]# kubectl create -f mysql-rc.yml 
[root@k8s-master tomcat_demo]# kubectl create -f mysql-svc.yml 
[root@k8s-master tomcat_demo]# kubectl get svc 复制vip地址
[root@k8s-master tomcat_demo]# vim tomcat-rc.yml 
[root@k8s-master tomcat_demo]# kubectl create -f tomcat-rc.yml
[root@k8s-master tomcat_demo]# kubectl create -f tomcat-svc.yml
[root@k8s-master tomcat_demo]# kubectl exec -it mysql-vqmqn /bin/bash
mysql> use HPE_APP;
Database changed
mysql>  select * from T_USERS
mysql>  select * from T_USERS;
重启四连
systemctl restart flanneld.service 
systemctl restart docker
systemctl restart kubelet.service
systemctl restart kube-proxy.service

4:k8s的附加组件

k8s集群中dns服务的作用:就是将svc的名称解析成对应VIP地址

4.1 dns服务

安装dns服务
1:下载dns_docker镜像包(node2节点10.0.0.13)
wget http://192.168.37.200/191127/docker_k8s_dns.tar.gz

2:导入dns_docker镜像包(node2节点10.0.0.13)
​ 注意:将node2主机进行扩容到3G

3:创建dns服务

#上传dns的yml文件
[root@k8s-master dns]# cat skydns-rc.yaml 
  spec:
    nodeName: k8s-node-2
    containers
[root@k8s-master dns]# kubectl create -f skydns-rc.yaml
[root@k8s-master dns]# kubectl create -f skydns-svc.yaml

4:检查

# kubectl get all --namespace=kube-system == kubectl get all -n kube-system

在这里插入图片描述
5:修改所有node节点kubelet的配置文件(由于将dns注入到容器中 docker run --dns)

[root@k8s-node-1 ~]# vim  /etc/kubernetes/kubelet
KUBELET_ARGS="--cluster_dns=10.254.230.254 --cluster_domain=cluster.local"
[root@k8s-node-1 ~]# systemctl restart kubelet

注意:dns启动,只是新pod生效
6:修改tomcat-rc.yml

[root@k8s-master tomcat_demo]# cat tomcat-rc.yml 
          env:
          - name: MYSQL_SERVICE_HOST
            value: 'mysql'                            #修改前提是vip
[root@k8s-master tomcat_demo]# kubectl delete -f .
[root@k8s-master tomcat_demo]# kubectl create -f .

7:验证
在这里插入图片描述

4.2 namespace命令空间

namespace做资源隔离,资源分组

[root@k8s-master dns]# kubectl get namespace 
[root@k8s-master dns]# kubectl create namespace oldboy
[root@k8s-master dns]# kubectl get rc oldboy

创建namespace

第一步:创建一个namespace
[root@k8s-master tomcat_demo]# kubectl create namespace tomcat
第二步:在每个配置文件中添加一个属性(namespace: tomcat)
[root@k8s-master tomcat_demo]# sed -i '3a \ \ namespace: tomcat' *
第三步:创建新的资源
[root@k8s-master tomcat_demo]# kubectl create -f .
第四步:查看资源
[root@k8s-master tomcat_demo]# kubectl get all -n tomcat
NAME       DESIRED   CURRENT   READY     AGE
rc/mysql   1         1         1         11s
rc/myweb   1         1         1         11s

NAME        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
svc/mysql   10.254.153.239   <none>        3306/TCP         11s
svc/myweb   10.254.16.61     <nodes>       8080:30008/TCP   11s

NAME             READY     STATUS    RESTARTS   AGE
po/mysql-mf4zm   1/1       Running   0          11s
po/myweb-wbh7p   1/1       Running   0          11s
注意:不同namespeace下的资源类型和资源名字都可以相同
#删除所有
kubectl delete rc --all
kubectl delete svc --all
kubectl delete deployment --all

4.3 健康检查和可用性检查

4.3.1 探针的种类

livenessProbe:健康状态检查,周期性检查服务是否存活,检查结果失败,将重启容器
readinessProbe:可用性检查,周期性检查服务是否可用,不可用将从service的endpoints中移除

4.3.2 探针的检测方法
  • exec:执行一段命令,返回值为0或非0
  • httpGet:检测某个 http 请求的返回状态码2xx,3xx正常,4xx,5xx错误
  • tcpSocket:测试某个端口是否能够连接
4.3.3 liveness探针的exec使用
[root@k8s-master checks]# cat  nginx_pod_exec.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: exec
spec:
  containers:
    - name: nginx
      image: 10.0.0.11: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         #检查周期,5秒检查一次
        timeoutSeconds: 5        #超时时间
        successThreshold: 1      #成功1次就是健康
        failureThreshold: 1      #失败1次就是失败
#创建之后测试: kubectl describe pod exec
过一段时间会出现warning,killing...
#注意:
dockerfile:
   CMD:容易被覆盖
   ENTRYPOINT:不容易被覆盖
k8s:
   args :容易被覆盖
   command: 不容易被覆盖
4.3.4 liveness探针的httpGet使用
[root@k8s-master checks]# vi nginx_pod_httpGet.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: httpget
spec:
  containers:
    - name: nginx
      image: 10.0.0.11:5000/nginx:1.13
      ports:
        - containerPort: 80
      livenessProbe:
        httpGet:
          path: /index.html   #这里设置的健康检查是首页
          port: 80
        initialDelaySeconds: 3
        periodSeconds: 3
#创建之后测试
[root@k8s-master checks]# kubectl describe pod httpget 
#进入容器移除首页就会出现错误则健康检查显示失败
[root@k8s-master checks]# kubectl exec -it httpget /bin/bash
root@httpget:/# mv /usr/share/nginx/html/index.html /tmp/
#再次测试
[root@k8s-master checks]# kubectl describe pod httpget 

在这里插入图片描述

4.3.5 liveness探针的tcpSocket使用???
vi   nginx_pod_tcpSocket.yaml
iapiVersion: v1
kind: Pod
metadata:
  name: tcpSocket
spec:
  containers:
    - name: nginx
      image: 10.0.0.11:5000/nginx:1.13
      ports:
        - containerPort: 80
      args:
        - /bin/sh
        - -c
        - tail -f /etc/hosts
      livenessProbe:
        tcpSocket:
          port: 80
        initialDelaySeconds: 10
        periodSeconds: 3
4.3.6 readiness探针的httpGet使用
[root@k8s-master checks]#vim nginx-rc-httpGet.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.11:5000/nginx:1.13
        ports:
        - containerPort: 80
        readinessProbe:
          httpGet:
            path: /qiangge.html  #检查标准是在站点目录下有一个qiangge.html文件
            port: 80
          initialDelaySeconds: 3
          periodSeconds: 3
#创建之后为readiness创建一个svc
[root@k8s-master checks]# kubectl expose rc readiness -- type=NodePort -- port=80 --target-port=80
#进入容器在站点目录下添加qiangge.html
[root@k8s-master checks]# kubectl exec -it readiness-f9bc6 /bin/bash
root@readiness-f9bc6:/# echo 'oldboy' >/usr/share/nginx/html/qiangge.html
# kubectl describe svc readiness 
  Endpoints:		172.18.77.7:80  #可以查看到ip地址

现在就可以访问10.0.0.12:38711
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zf3ZKKqE-1583328309769)(C:\Users\mengh\AppData\Roaming\Typora\typora-user-images\1583148738711.png)]

4.4 dashboard服务

1:上传并导入镜像,打标签
2:创建dashborad的deployment和service

[root@k8s-master dashboard]# cat dashboard.yaml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
# Keep the name in sync with image version and
# gce/coreos/kube-manifests/addons/dashboard counterparts
  name: kubernetes-dashboard-latest
  namespace: kube-system
spec:
  replicas: 1
  template:
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
        version: latest
        kubernetes.io/cluster-service: "true"
    spec:
      nodeName: k8s-node-2
      containers:
      - name: kubernetes-dashboard
        image: 10.0.0.11:5000/kubernetes-dashboard-amd64:v1.4.1
        resources:
          # keep request = limit to keep this container in guaranteed class
          limits:
            cpu: 100m
            memory: 50Mi
          requests:
            cpu: 100m
            memory: 50Mi
        ports:
        - containerPort: 9090
        args:
         -  --apiserver-host=http://10.0.0.11:8080
        livenessProbe:
          httpGet:
            path: /
            port: 9090
          initialDelaySeconds: 30
          timeoutSeconds: 30
[root@k8s-master dashboard]# cat dashboard-svc.yaml 
apiVersion: v1
kind: Service
metadata:
  name: kubernetes-dashboard
  namespace: kube-system
  labels:
    k8s-app: kubernetes-dashboard
    kubernetes.io/cluster-service: "true"
spec:
  selector:
    k8s-app: kubernetes-dashboard
  ports:
  - port: 80
    targetPort: 9090
[root@k8s-master dashboard]# kubectl create -f .
访问之前先ping一下dashboard的ip
kubectl get all -n kube-system -o wide

注意:所有k8s附加组件,都会放在kube-system

3:访问http://10.0.0.11:8080/ui/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5mvkBxOH-1583328309770)(C:\Users\mengh\AppData\Roaming\Typora\typora-user-images\1583149635305.png)]
dashboard:web控制台,降低操作的门槛

admin区域(全局资源)
admin区域下面(局部资源,属于某一个nanespace)
工作目录:
deployment
Replica Sets
ReplicationController
daemonset  每一个node节点启动一个pod资源
pet set    适合数据库
###petset  宠物应用,不能随便删除,有数据,有序(新版本:stateful 有状态应用)
###rs,rc  畜生应用,随便删,没有数据,无序(新版本:stateless 无状态应用)
job   备份job,一次性任务,导入数据
pod   最小资源    需要24小时一直运行
服务和自动发现
SVC:四层负载均衡
ingress:七层负载均衡(k8s的新版本)
存储:

创建一个daemonset

[root@k8s-master daemonset]# cat k8s_daemonset.yml 
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: nginx
spec:
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: 10.0.0.11:5000/nginx:1.13
        ports:
        - containerPort: 80
        resources:  
          limits:
            cpu: 100m
          requests:
            cpu: 100m
[root@k8s-master daemonset]# kubectl create -f k8s_daemonset.yml

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bx3D58Wr-1583328309771)(C:\Users\mengh\AppData\Roaming\Typora\typora-user-images\1583151192592.png)]
不删掉会跟后面环境冲突
[root@k8s-master daemonset]# kubectl delete -f k8s_daemonset.yml

4.5 通过apiservicer反向代理访问service

http://10.0.0.11:8080/api/v1/proxy/namespaces/kube-system/services/kubernetes-dashboard/#/admin?namespace=default
http://10.0.0.11:8080/api/v1/proxy 固定写法
/namespaces/kube-system            所属namespace
/services/kubernetes-dashboard/    svc的名字
url中的#,锚点,定位符
第一种:NodePort类型 
  type: NodePort
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30008

第二种:ClusterIP类型
  type: ClusterIP
  ports:
    - port: 80
      targetPort: 80
      
http://10.0.0.11:8080/api/v1/proxy/namespaces/命令空间/services/service的名字/
#例子:
http://10.0.0.11:8080/api/v1/proxy/namespaces/qiangge/services/wordpress

5: k8s弹性伸缩

k8s弹性伸缩,需要附加插件heapster监控
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kWLuWuim-1583328309772)(C:\Users\mengh\AppData\Roaming\Typora\typora-user-images\1583153145137.png)]

5.1 安装heapster监控

1:上传并导入镜像,打标签

ls *.tar.gz
for n in `ls *.tar.gz`;do docker load -i $n ;done
docker tag docker.io/kubernetes/heapster_grafana:v2.6.0 10.0.0.11:5000/heapster_grafana:v2.6.0
docker tag  docker.io/kubernetes/heapster_influxdb:v0.5 10.0.0.11:5000/heapster_influxdb:v0.5
docker tag docker.io/kubernetes/heapster:canary 10.0.0.11:5000/heapster:canary

2:上传配置文件,kubectl create -f .

修改配置文件:
[root@k8s-master heapster]# cat heapster-controller.yaml 
    spec:
      nodeName: k8s-node-2
      containers:
      - name: heapster
        image: 10.0.0.11:5000/heapster:canary
        imagePullPolicy: IfNotPresent
[root@k8s-master heapster]# influxdb-grafana-controller.yaml
    spec:
      nodeName: k8s-node-2
      containers:

3:创建之后打开dashboard验证
在这里插入图片描述

5.2 弹性伸缩

1:修改rc的配置文件

  containers:
  - name: myweb
    image: 10.0.0.11:5000/nginx:1.13
    ports:
    - containerPort: 80
    resources:
      limits:
        cpu: 100m
      requests:
        cpu: 100m

创建一个能够被外界访问的资源

[root@k8s-master deploy]# kubectl create -f k8s_deploy.yml
#创建service能够被外界访问
[root@k8s-master deploy]# kubectl expose deployment nginx --type=NodePort  --port=80 --target-port=80

2:创建弹性伸缩规则
kubectl autoscale deployment nginx --max=8 --min=1 --cpu-percent=10

autoscale:创建HPA(horizontal-pod-autoscaler pod水平自动扩展---弹性伸缩)
创建deployment nginx的弹性规则:
--max 最大pod数量
--min 最小pod数量
--cpu cpu的使用率(百分比)

3:测试

#安装ab命令
yum install -y httpd-tools
同时两个节点进行压力测试
ab -n 1000000 -c 40  http://10.0.0.12:33218/

扩容截图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xNdi5XQQ-1583328309774)(C:\Users\mengh\AppData\Roaming\Typora\typora-user-images\1583154774317.png)]

缩容:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uY4K1OLY-1583328309775)(C:\Users\mengh\AppData\Roaming\Typora\typora-user-images\1583155018142.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7Im8YL6e-1583328309777)(C:\Users\mengh\AppData\Roaming\Typora\typora-user-images\1583155098289.png)]

6:持久化存储

数据持久化类型:

6.1 emptyDir:

#声明持久化的方式
      volumes:
        - name: tomcat-db
          emptyDir: {}
#声明需要持久化的容器目录(基础)
          volumeMounts:
            - name: tomcat-db
            - mountPath: /var/lib/mysql
#删除pod容器
[root@k8s-master wordpress]# kubectl delete -f .
#修改配置文件
[root@k8s-master wordpress]# cat -n mysql-rc.yml 
    13	    spec:
    14	      nodeName: k8s-node-1
    15	      volumes:
    16	        - name: wordpress-db
    17	          emptyDir: {}
    18	      containers:
    19	        - name: wordpress-db
    20	          image: 10.0.0.11:5000/mysql:5.7
    21	          volumeMounts:
    22	            - name: wordpress-db
    23	              mountPath: /var/lib/mysql
[root@k8s-master wordpress]# cat -n wordpress-rc.yml 
    13	    spec:
    14	      nodeName: k8s-node-1 
    15	      volumes:
    16	        - name: wordpress-web
    17	          emptyDir: {}
    18	      containers:
    19	        - name: wordpress
    20	          image: 10.0.0.11:5000/wordpress:latest
    21	          volumeMounts:
    22	            - name: wordpress-web
    23	              mountPath: /var/www/html
#创建pod容器
[root@k8s-master wordpress]# kubectl create -f .

测试:10.0.0.12:30007
在node1主机清除容器,再次访问页面还是会出现博文
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8epDn07e-1583328309778)(C:\Users\mengh\AppData\Roaming\Typora\typora-user-images\1583212457753.png)]
问题:删除pod之后持久化就会失败—HostPath

6.2 HostPath:

hostPath:删除pod, 也不影响数据持久化
把宿主机目录挂载到容器中

#删除pod容器
[root@k8s-master wordpress]# kubectl delete -f .
#修改配置文件
[root@k8s-master wordpress]# cat -n mysql-rc.yml 
    13	    spec:
    14	      nodeName: k8s-node-1
    15	      volumes:
    16	        - name: wordpress-db     #宿主机目录(会自动创建)
    17	          hostPath:
    18	            path: /data/wordpress-db
    19	      containers:
    20	        - name: wordpress-db
    21	          image: 10.0.0.11:5000/mysql:5.7
    22	          volumeMounts:
    23	            - name: wordpress-db
    24	              mountPath: /var/lib/mysql
[root@k8s-master wordpress]# cat -n wordpress-rc.yml 
    13	    spec:
    14	      nodeName: k8s-node-1 
    15	      volumes:
    16	        - name: wordpress-web
    17	          hostPath: 
    18	            path: /data/wordpress-web     #宿主机目录(会自动创建)
    19	      containers:
    20	        - name: wordpress
    21	          image: 10.0.0.11:5000/wordpress:latest
    22	          volumeMounts:
    23	            - name: wordpress-web
    24	              mountPath: /var/www/html
#创建pod容器
[root@k8s-master wordpress]# kubectl create -f .

测试:10.0.0.12:30007
在master主机清除pod,再次访问页面还是会出现博文
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jtYmGqg4-1583328309779)(C:\Users\mengh\AppData\Roaming\Typora\typora-user-images\1583213379426.png)]
问题:现在网站在node1上运行,一旦node1宕机,所有节点转移到node2,数据还是会丢失,hostPath不能跨宿主机—nfs

6.3 nfs:

共享文件系统,k8s创建一个临时目录挂载nfs,pod在nfs上读取数据,一旦一个节点宕机,pod漂移到另一个节点,k8s会把nfs目录挂载到新的节点
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JXqriEXA-1583328309780)(C:\Users\mengh\AppData\Roaming\Typora\typora-user-images\1583214326883.png)]

6.4 pv和pvc:

pv: persistent volume 全局资源,k8s集群
pvc: persistent volume claim, 局部资源属于某一个namespace

6.4.1:安装nfs服务端(10.0.0.11)
[root@k8s-master ~]# yum install nfs-utils.x86_64 -y
[root@k8s-master ~]# mkdir /oldboy
[root@k8s-master ~]# vim /etc/exports
/oldboy  10.0.0.0/24(rw,async,no_root_squash,no_all_squash)
systemctl restart rpcbind
systemctl restart nfs
systemctl enable rpcbind
systemctl enable nfs
6.4.2:在node节点安装nfs客户端
[root@k8s-node-1 ~]# yum install nfs-utils.x86_64 -y
showmount -e 10.0.0.11
6.4.3:创建pv和pvc

上传yaml配置文件,创建pv和pvc,pvc是pv的分配
Persistent Volumes:全局资源
Persistent Volume Claims:局部资源
在这里插入图片描述

#准备上面的三个pv的yaml文件
#创建三个目录
mkdir /oldboy/pv{1..3}
#创建pv文件
kubectl create -f mysql_pv.yaml 
kubectl create -f mysql_pv2.yaml 
kubectl create -f mysql_pv3.yaml 
#查看pv
kubectl get pv

编辑pvc文件

[root@k8s-master volume]# cat mysql_pvc.yaml 
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: tomcat-mysql
  namespace: tomcat
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 50Gi
kubectl create -f mysql_pvc.yaml 
kubectl get pvc -n tomcat 
6.4.4:创建mysql-rc,pod模板里使用volume
[root@k8s-master tomcat_demo]# cat -n mysql-rc.yml 
    14	    spec:
    15	      volumes:
    16	        - name: tomcat-db
    17	          persistentVolumeClaim:
    18	            claimName: tomcat-mysql 
    19	      containers:
    20	        - name: mysql
    21	          image: 10.0.0.11:5000/mysql:5.7
    22	          volumeMounts:
    23	            - name: tomcat-db
    24	              mountPath: /var/lib/mysql
kubectl delete -f .
kubectl create -f .
ls /oldboy/pv2
6.4.5: 验证持久化

验证方法1:删除mysql的pod,数据库不丢
kubectl delete pod mysql-gt054
验证方法2:查看nfs服务端,是否有mysql的数据文件
在这里插入图片描述

6.4.6: nfs不用创建pv和pvc

创建共享目录

[root@k8s-master ~]# mkdir /oldboy/wordpress-db -p 
[root@k8s-master ~]# mkdir /oldboy/wordpress-web -p 
#删除pod容器
[root@k8s-master wordpress]# kubectl delete -f .
#修改配置文件
[root@k8s-master wordpress]# cat -n mysql-rc.yml 
    13	    spec:
    14	      volumes:
    15	        - name: wordpress-db
    16	          nfs:
    17	            path: /oldboy/wordpress-db
    18	            server: 10.0.0.11
    19	      containers:
    20	        - name: wordpress-db
    21	          image: 10.0.0.11:5000/mysql:5.7
    22	          volumeMounts:
    23	            - name: wordpress-db
    24	              mountPath: /var/lib/mysql
[root@k8s-master wordpress]# cat -n wordpress-rc.yml 
    13	    spec:
    14	      volumes:
    15	        - name: wordpress-web
    16	          nfs: 
    17	            path: /oldboy/wordpress-web
    18	            server: 10.0.0.11
    19	      containers:
    20	        - name: wordpress
    21	          image: 10.0.0.11:5000/wordpress:latest
    22	          volumeMounts:
    23	            - name: wordpress-web
    24	              mountPath: /var/www/html
#创建pod容器
[root@k8s-master wordpress]# kubectl create -f .
#node1节点挂载的数据库
[root@k8s-node-1 ~]# df -hT|grep -i nfs
10.0.0.11:/oldboy/wordpress-db nfs4       48G  3.6G   45G   8% /var/lib/kubelet/pods/8a311156-5d13-11ea-993e-000c2903e223/volumes/kubernetes.io~nfs/wordpress-db
#node2节点挂载的web
[root@k8s-node-2 ~]# df -hT|grep -i nfs
10.0.0.11:/oldboy/wordpress-web nfs4       48G  3.6G   45G   8% /var/lib/kubelet/pods/8a4fa21d-5d13-11ea-993e-000c2903e223/volumes/kubernetes.io~nfs/wordpress-web

验证持久化:
验证方法1:*除mysql的pod,数据库不丢

# kubectl delete pod wordpress-db-r9tv0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w2RHQfYQ-1583328309783)(C:\Users\mengh\AppData\Roaming\Typora\typora-user-images\1583215443947.png)]
验证方法2:查看nfs服务端,是否有mysql的数据文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XUj8ilaW-1583328309784)(C:\Users\mengh\AppData\Roaming\Typora\typora-user-images\1583215639013.png)]

6.5: 分布式存储glusterfs

a: 什么是glusterfs

Glusterfs是一个开源分布式文件系统,具有强大的横向扩展能力,可支持数PB存储容量和数千客户端,通过网络互联成一个并行的网络文件系统。具有可扩展性、高性能、高可用性等特点。
b: 安装glusterfs

所有节点:
#安装源
yum install centos-release-gluster6.noarch -y
#安装软件
yum install  glusterfs-server -y
systemctl start glusterd.service
systemctl enable glusterd.service
#为gluster集群增加存储单元brick
# 每一台机器都添加三块硬盘
#让硬盘生效(不用重启)
 echo '- - -' >/sys/class/scsi_host/host0/scan 
 echo '- - -' >/sys/class/scsi_host/host1/scan 
 echo '- - -' >/sys/class/scsi_host/host2/scan
#格式化
mkfs.xfs /dev/sdb
mkfs.xfs /dev/sdc
mkfs.xfs /dev/sdd
#挂载
mkdir -p /gfs/test1
mkdir -p /gfs/test2
mkdir -p /gfs/test3
mount /dev/sdb /gfs/test1
mount /dev/sdc /gfs/test2
mount /dev/sdd /gfs/test3

c: 添加存储资源池

master节点:
#查看资源池
gluster pool list
#将节点加入资源池(只需要加一次)
gluster peer probe 10.0.0.12
gluster peer probe 10.0.0.13
gluster pool list

d: glusterfs卷管理

#创建分布式复制卷
gluster volume create qiangge replica 2 k8s-master:/gfs/test1 k8s-node-1:/gfs/test1 k8s-master:/gfs/test2  k8s-node-1:/gfs/test2 force
#启动卷
gluster volume start qiangge
#查看卷
gluster volume info qiangge 
#挂载卷
mount -t glusterfs 10.0.0.11:/qiangge /mnt
清空数据
停止卷
# gluster volume stop oldboy
删除卷
# gluster volume delete oldboy

e: 分布式复制卷讲解

gluster volume create oldgirl replica 3 10.0.0.11:/gfs/test1 10.0.0.12:/gfs/test1 10.0.0.13:/gfs/test1 10.0.0.11:/gfs/test2 10.0.0.12:/gfs/test2 10.0.0.13:/gfs/test2 10.0.0.11:/gfs/test3 10.0.0.12:/gfs/test3 10.0.0.13:/gfs/test3 force

gluster volume start oldgirl
mount -t glusterfs 10.0.0.11:/oldgirl /mnt

在这里插入图片描述
f: 分布式复制卷扩容

#扩容前查看容量:
df   -h
#扩容命令:
gluster volume add-brick qiangge k8s-node-2:/gfs/test1 k8s-node-2:/gfs/test2 force
#扩容后查看容量:
df   -h

[root@k8s-node-2 ~]# rpm -qa|grep gluster|grep fuse
glusterfs-fuse-6.7-1.el7.x86_64 #客户端需要

6.6 k8s 对接glusterfs存储

a:创建endpoint

[root@k8s-master glusterfs]# cat glusterfs-ep.yaml 
apiVersion: v1
kind: Endpoints
metadata:
  name: glusterfs
  namespace: tomcat
subsets:
- addresses:
  - ip: 10.0.0.11
  - ip: 10.0.0.12
  - ip: 10.0.0.13
  ports:
  - port: 49152
    protocol: TCP
[root@k8s-master glusterfs]# kubectl create -f glusterfs-ep.yaml 
endpoints "glusterfs" created
[root@k8s-master glusterfs]# kubectl get endpoints -n tomcat 
NAME        ENDPOINTS                                         AGE
glusterfs   10.0.0.11:49152,10.0.0.12:49152,10.0.0.13:49152   10s
mysql       172.18.70.12:3306                                 18h
myweb       172.18.70.9:8080                                  18h

b: 创建service(用于外部服务映射的svc,不需要标签选择器)

[root@k8s-master glusterfs]# cat glusterfs-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: glusterfs
  namespace: tomcat
spec:
  ports:
  - port: 49152
    protocol: TCP
    targetPort: 49152
  type: ClusterIP
[root@k8s-master glusterfs]# kubectl create -f glusterfs-svc.yaml 
service "glusterfs" created
[root@k8s-master glusterfs]# kubectl get svc -n tomcat -o wide 
NAME        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE       SELECTOR
glusterfs   10.254.236.75   <none>        49152/TCP        18s       <none>
mysql       10.254.212.45   <none>        3306/TCP         18h       app=mysql
myweb       10.254.0.10     <nodes>       8080:30008/TCP   18h       app=myweb
[root@k8s-master tomcat_demo]# cat -n mysql-rc.yml 
    14	    spec:
    15	      volumes:
    16	        - name: tomcat-db
    17	          glusterfs:
    18	            path: oldboy
    19	            endpoints: glusterfs
[root@k8s-master tomcat_demo]# kubectl delete -f .
[root@k8s-master tomcat_demo]# kubectl create -f .

c: 创建gluster类型pv

apiVersion: v1
kind: PersistentVolume
metadata:
  name: gluster
  labels:
    type: glusterfs
spec:
  capacity:
    storage: 50Gi
  accessModes:
    - ReadWriteMany
  glusterfs:
    endpoints: "glusterfs"
    path: "qiangge"
    readOnly: false

d: 创建pvc

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: gluster
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 200Gi

e:在pod中使用gluster

vi  nginx_pod.yaml
…… 
        volumeMounts:
        - name: nfs-vol2
          mountPath: /usr/share/nginx/html
     volumes:
     - name: nfs-vol2
       persistentVolumeClaim:
         claimName: gluster

7:使用jenkins实现持续更新

ip地址服务内存
10.0.0.11kube-apiserver 80801G
10.0.0.12kube-apiserver 80801G
10.0.0.13jenkins(tomcat + jdk) 80803G

代码仓库使用gitee托管
在这里插入图片描述
在这里插入图片描述
点击创建
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G7dncrWn-1583328309790)(C:\Users\mengh\AppData\Roaming\Typora\typora-user-images\1583291031222.png)]

7.1: 安装gitlab并上传代码

###在node2节点
#设置账号
git config --global user.name "Didierya"
git config --global user.email "807529573@qq.com"
#初始化代码仓库
cd /opt
mkdir yiliao
cd yiliao
git init
touch README.md
git add README.md
git commit -m "first commit"
git remote add origin https://gitee.com/didierya/yiliao.git
git push -u origin master  ---回车输入用户名密码
#上传代码
 unzip yiliaoqixie.zip 
 mv yiliaoqixie/* .
 rm -rf yiliaoqixie*
#提交到私有仓库
git add .
git commit -m "second commit"
git push -u origin master   ---回车输入用户名密码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3EYWLvVj-1583328309791)(C:\Users\mengh\AppData\Roaming\Typora\typora-user-images\1583291518747.png)]

#编写dockerfile并测试
[root@k8s-node-2 yiliao]# cat dockerfile 
FROM 10.0.0.11:5000/nginx:1.13
ADD . /usr/share/nginx/html
[root@k8s-node-2 yiliao]# docker build -t yiliao:v1 .
[root@k8s-node-2 yiliao]# docker run -d -p 80:80 yiliao:v1 
测试:访问网页10.0.0.13

#将dockerfile提交到私有仓库
git add .
git commit -m "add dockerfile"
git push -u origin master   ---回车输入用户名密码

7.2 安装jenkins,并自动构建docker镜像

7.2.1:安装jenkins

安装jdk和tomcat,放入war包,解压Jenkins插件到特定目录

#上传四个包或者本地上传
cd /opt/
wget   http://192.168.12.201/191216/apache-tomcat-8.0.27.tar.gz 
wget   http://192.168.12.201/191216/jdk-8u102-linux-x64.rpm     
wget   http://192.168.12.201/191216/jenkin-data.tar.gz       
wget   http://192.168.12.201/191216/jenkins.war                       
rpm -ivh jdk-8u102-linux-x64.rpm 
mkdir /app -p
tar xf apache-tomcat-8.0.27.tar.gz -C /app
rm -fr /app/apache-tomcat-8.0.27/webapps/*
mv jenkins.war /app/apache-tomcat-8.0.27/webapps/ROOT.war
tar xf jenkin-data.tar.gz -C /root
/app/apache-tomcat-8.0.27/bin/startup.sh 
netstat -lntup
7.2.2:访问jenkins

访问http://10.0.0.13:8080/,默认账号密码admin:123456
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lgicMlLu-1583328309792)(C:\Users\mengh\AppData\Roaming\Typora\typora-user-images\1583294192441.png)]

7.2.3:配置jenkins拉取gitlab代码凭据

a:在jenkins上生成秘钥对
ssh-keygen -t rsa
b:复制公钥粘贴gitlab上
在这里插入图片描述
c:jenkins上创建全局凭据

在这里插入图片描述
或者:
在这里插入图片描述

7.2.4:拉取代码测试

先新建一个任务
在这里插入图片描述

7.2.5:编写dockerfile并测试
#vim dockerfile
FROM 10.0.0.11:5000/nginx:1.13
add .  /usr/share/nginx/html

添加docker build构建时不add的文件
vim .dockerignore dockerfile
docker build -t xiaoniao:v1 . docker run -d -p 88:80 xiaoniao:v1
打开浏览器测试访问xiaoniaofeifei的项目
测试项目二:

kubectl create namespace yiliao
kubectl run -n yiliao yiliao --image=10.0.0.11:5000/yiliao:v1 --replicas=2 --record 
kubectl get all -n yiliao 
kubectl expose -n yiliao deployment yiliao --type=NodePort --port=80 --target-port=80
kubectl get all -n yiliao 
kubectl get all -n yiliao -o wide
kubectl set image -n yiliao deployment yiliao yiliao=10.0.0.11:5000/yiliao:v2
7.2.6:上传dockerfile和.dockerignore到私有仓库

git add docker .dockerignore git commit -m “fisrt commit” git push -u origin master

7.2.7:点击jenkins立即构建,自动构建docker镜像并上传到私有仓库

修改jenkins 工程配置
在这里插入图片描述
docker build -t 10.0.0.11:5000/test:v B U I L D I D . d o c k e r p u s h 10.0.0.11 : 5000 / t e s t : v BUILD_ID . docker push 10.0.0.11:5000/test:v BUILDID.dockerpush10.0.0.11:5000/test:vBUILD_ID

7.3 jenkins自动部署应用到k8s

kubectl -s 10.0.0.11:8080 get nodes

if [ -f /tmp/xiaoniao.lock ];then
    docker  build  -t  10.0.0.11:5000/xiaoniao:v$BUILD_ID  .
    docker  push 10.0.0.11:5000/xiaoniao:v$BUILD_ID
    kubectl -s 10.0.0.11:8080 set image  -n xiaoniao deploy xiaoniao xiaoniao=10.0.0.11:5000/xiaoniao:v$BUILD_ID
    port=`kubectl -s 10.0.0.11:8080  get svc -n xiaoniao|grep -oP '(?<=80:)\d+'`
    echo "你的项目地址访问是http://10.0.0.13:$port"
    echo "更新成功"
else
    docker  build  -t  10.0.0.11:5000/xiaoniao:v$BUILD_ID  .
    docker  push 10.0.0.11:5000/xiaoniao:v$BUILD_ID
    kubectl  -s 10.0.0.11:8080  create  namespace  xiaoniao
    kubectl  -s 10.0.0.11:8080  run   xiaoniao  -n xiaoniao  --image=10.0.0.11:5000/xiaoniao:v$BUILD_ID --replicas=3 --record
    kubectl  -s 10.0.0.11:8080   expose -n xiaoniao deployment xiaoniao --port=80 --type=NodePort
    port=`kubectl -s 10.0.0.11:8080  get svc -n xiaoniao|grep -oP '(?<=80:)\d+'`
    echo "你的项目地址访问是http://10.0.0.13:$port"
    echo "发布成功"
    touch /tmp/xiaoniao.lock
    chattr +i /tmp/xiaoniao.lock
fi

jenkins一键回滚
kubectl -s 10.0.0.11:8080 rollout undo -n xiaoniao deployment xiaoniao

8: k8s高可用

保证master节点高可用 etcd api-server controller-manager scheduler

8.1: 安装配置etcd高可用集群

#所有节点安装etcd
yum install  etcd  -y
vim /etc/etcd/etcd.conf 
3:ETCD_DATA_DIR="/var/lib/etcd/"
5:ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
6:ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
9:ETCD_NAME="node1"           #节点的名字
20:ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.0.0.11:2380"   #节点的同步数据的地址
21:ETCD_ADVERTISE_CLIENT_URLS="http://10.0.0.11:2379"         #节点对外提供服务的地址
26:ETCD_INITIAL_CLUSTER="node1=http://10.0.0.11:2380,node2=http://10.0.0.12:2380,node3=http://10.0.0.13:2380"
27:ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
28:ETCD_INITIAL_CLUSTER_STATE="new"
注意:2380::2379:
#三个节点同时进行
systemctl enable  etcd
systemctl restart  etcd

[root@k8s-master ~]# etcdctl cluster-health
member 9e80988e833ccb43 is healthy: got healthy result from http://10.0.0.11:2379
member a10d8f7920cc71c7 is healthy: got healthy result from http://10.0.0.13:2379
member abdc532bc0516b2d is healthy: got healthy result from http://10.0.0.12:2379
cluster is healthy

#修改flannel
vim  /etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS="http://10.0.0.11:2379,http://10.0.0.12:2379,http://10.0.0.13:2379"
etcdctl mk /atomic.io/network/config   '{ "Network": "172.18.0.0/16" }'
systemctl  restart flanneld
systemctl  restart docker

8.2 安装配置master01的api-server,controller-manager,scheduler(127.0.0.1:8080)

vim /etc/kubernetes/apiserver 
KUBE_ETCD_SERVERS="--etcd-servers=http://10.0.0.11:2379,http://10.0.0.12:2379,http://10.0.0.13:2379"

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

systemctl restart kube-apiserver.service 
systemctl restart kube-controller-manager.service kube-scheduler.service 

8.3 安装配置master02的api-server,controller-manager,scheduler(127.0.0.1:8080)

yum install kubernetes-master.x86_64 -y
scp -rp 10.0.0.11:/etc/kubernetes/apiserver /etc/kubernetes/apiserver
scp -rp 10.0.0.11:/etc/kubernetes/config /etc/kubernetes/config 
systemctl stop kubelet.service 
systemctl disable kubelet.service
systemctl stop kube-proxy.service 
systemctl disable kube-proxy.service

systemctl enable kube-apiserver.service
systemctl restart kube-apiserver.service
systemctl enable kube-controller-manager.service
systemctl restart kube-controller-manager.service
systemctl enable kube-scheduler.service
systemctl restart kube-scheduler.service

8.4 为master01和master02安装配置Keepalived

yum install keepalived.x86_64 -y

#master01配置:
! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL_11
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.10
    }
}

#master02配置
! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL_12
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.10
    }
}

systemctl  enable  keepalived
systemctl  start   keepalived

8.5: 所有node节点kubelet,kube-proxy指向api-server的vip

vim /etc/kubernetes/kubelet
KUBELET_API_SERVER="--api-servers=http://10.0.0.10:8080"

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

systemctl restart kubelet.service kube-proxy.service

测试:查看到的pod三个节点都一样

[root@k8s-node-2 ~]# kubectl -s 10.0.0.10:8080 run nginx --image=10.0.0.11:5000/nginx:1.13 --replicas=2
###查看到的pod三个节点都一样
[root@k8s-node-2 ~]# kubectl -s 10.0.0.10:8080 get pod
NAME                    READY     STATUS    RESTARTS   AGE
nginx-847814248-j8d03   1/1       Running   0          24s
nginx-847814248-m5n6z   1/1       Running   0          24s
[root@k8s-node-1 ~]# kubectl get pod
NAME                    READY     STATUS    RESTARTS   AGE
nginx-847814248-j8d03   1/1       Running   0          35s
nginx-847814248-m5n6z   1/1       Running   0          35s
[root@k8s-master ~]# kubectl get pod
NAME                    READY     STATUS    RESTARTS   AGE
nginx-847814248-j8d03   1/1       Running   0          1m
nginx-847814248-m5n6z   1/1       Running   0          1m
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐