第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 命名空间。
下面描述众多插件中的几种。有关可用插件的完整列表,
k8s安装部署
1.1、准备环境
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网络安装
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

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/

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持久化实战
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扩容存储
分布式文件管理系统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安装
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代码部署
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简介图
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)