Kubernetes k8s
Kubernetes k8s
生成级别的容器编排工具
https://kubernetes.io/
https://www.kubernetes.org.cn/course
https://kubernetes.io/docs/tutorials/kubernetes-basics/
安装minikube
https://minikube.sigs.k8s.io/docs/start/
准备环境
1 .系统准备 centos 8.2
2 .2 台机器都是 2C/4G
3 .关闭 firewalld 和 selinux
#注:查看版本
[root@k8s ~]# cat /etc/centos-release
CentOS Linux release 8.2.2004 (Core)
[root@k8s ~]# hostname minikube
#注:关闭防火墙和selinux
[root@minikube ~]# service firewalld stop
[root@minikube ~]# systemctl disable firewalld
[root@minikube ~]# setenforce 0
[root@minikube ~]# vim /etc/selinux/config
SELINUX=disabled
安装docker
1 .下载 docker 的 yum 源
[root@minikube ~]# curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2 .安装 docker
[root@minikube ~]# yum install docker-ce -y
[root@minikube ~]# docker --version
Docker version 20.10.5, build 55c4c88
3 .启动docker服务、设置开机启动
[root@minikube ~]# systemctl start docker && systemctl enable docker
4 .配置 Docker 使用 cgroupfs 作为默认 Cgroup 驱动,k8s和docker的cgroup驱动必须要一致
[root@minikube ~]# vim /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=cgroupfs"]
}
5 .重启docker
[root@minikube ~]# systemctl restart docker
安装 kubeadm,kubectl,kubelet
1 .设置阿里的 kubeadm 源
[root@minikube ~]# vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes Repo
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
enable=1
2 .安装 kubeadm 等
[root@minikube ~]# yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
下载minikube的软件包
1 .下载
[root@minikube ~]# curl -Lo minikube http://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/releases/v1.2.0/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
[root@minikube ~]# minikube version
minikube version: v1.2.0
[root@minikube ~]# swapoff -a #注:关闭交换分区
2 .启动minikube
[root@minikube ~]# minikube start --vm-driver="none"
[root@minikube ~]# kubectl get node #注:查看整个集群里有哪些机器
NAME STATUS ROLES AGE VERSION
minikube Ready master 4m10s v1.15.0
[root@minikube ~]# swapoff -a #注:关闭交换分区
[root@minikube ~]# cat /proc/swaps
Filename Type Size Used Priority
[root@minikube ~]# minikube delete #注:删除
minikube安装的坑
cgroup驱动
docker容器和k8s的cgroup驱动必须要一致
cgroup的驱动
systemd
cgroupfs
角色
master
Master 负责管理整个集群。 Master 协调集群中的所有活动,例如调度应用、维护应用的所需状态、应用扩容以及推出新的更新。
Master 管理集群,Node 用于托管正在运行的应用。
node
Node 是一个虚拟机或者物理机,它在 Kubernetes 集群中充当工作机器的角色 每个Node都有 Kubelet , 它管理 Node 而且是 Node 与 Master 通信的代理。 Node 还应该具有用于处理容器操作的工具,例如 Docker 或 rkt 。处理生产级流量的 Kubernetes 集群至少应具有三个 Node 。
搭建多个节点的k8s集群
https://www.jianshu.com/p/e43f5e848da1
https://blog.51cto.com/linux1991/2372633
https://www.jianshu.com/p/f4ac7f4555d3
[root@minikube ~]# kubectl get node #注:查看kubernetes有多少节点
NAME STATUS ROLES AGE VERSION
minikube Ready master 16h v1.15.0
Pod 是一组一个或多个应用程序容器(例如 Docker 或 rkt ),包括共享存储(卷), IP 地址和有关如何运行它们的信息。
命令
kubectl get - 列出资源
kubectl describe - 显示有关资源的详细信息
kubectl logs - 打印 pod 和其中容器的日志
kubectl exec - 在 pod 中的容器上执行命令
kubectl exec -it sc-k8s-1-54b5b45f78-8srz8 /bin/bash
kubectl logs sc-k8s-1-54b5b45f78-8srz8
kubectl describe pod sc-k8s-1-54b5b45f78-8srz8
kubectl get pod
service服务 – 类型
ClusterIP:提供一个集群内部的虚拟IP以供Pod访问(service默认类型)。
只能在集群内部使用,外面不能访问过来
[root@minikube ~]# kubectl expose -f nginx_service.yaml
NodePort:在每个Node上打开一个端口以供外部访问
可以将pod对应的应用发布到外网
[root@minikube ~]# kubectl apply -f nginx_service8.yaml
vip是什么?
vip --> virtual ip 虚拟ip --> 高可用(HA --> High Availability)里的一个概念
vip是真正提供服务的ip地址
[root@minikube ~]# kubectl get node #注:得到整个集群的节点
[root@minikube ~]# minikube delete #注:删除原来的集群
问题
minikube ROLES 为
解决方法
[root@minikube ~]# minikube delete
[root@minikube ~]# minikube start --vm-driver="none"
Pod
Pod 是一组一个或多个应用程序容器(例如 Docker 或 rkt ),包括共享存储(卷), IP 地址和有关如何运行它们的信息
Pod是 Kubernetes 平台上的原子单元
[root@minikube ~]# kubectl get node #注:查看节点
[root@minikube ~]# kubectl get pod -A #注:查看有哪些pod
deployment 部署和调用的工具(组件)
$ kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1
deployment 是一个部署安装容器的一个工具
kubernetes-bootcamp 部署任务的名字
--image=gcr.io/google-samples/kubernetes-bootcamp:v1 部署的容器需要跑的镜像
$ kubectl get deployments
[root@minikube ~]# kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1
[root@minikube ~]# kubectl create deployment k8s-nginx --image=nginx
[root@minikube ~]# kubectl create deployment k8s-redis --image=redis
[root@minikube ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
minikube Ready master 22h v1.15.0
[root@minikube ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
k8s-nginx-6ff5777d4b-zqtfp 1/1 Running 0 5m31s
k8s-redis-8488dc6f89-6zdt2 1/1 Running 0 2m49s
kubernetes-bootcamp-75bccb7d87-qpnp9 0/1 ImagePullBackOff 0 9m7s
[root@minikube ~]# kubectl delete deployment k8s-nginx #注:删掉部署器
[root@minikube ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
k8s-redis-8488dc6f89-6zdt2 1/1 Running 0 7m4s
kubernetes-bootcamp-75bccb7d87-qpnp9 0/1 ImagePullBackOff 0 13m
[root@minikube ~]# kubectl create deployment k8s-nginx --image=nginx -r 3 #注:指定创建的数量(副本数)
[root@minikube ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
k8s-nginx 3/3 3 3 15m
k8s-redis 1/1 1 1 24m
kubernetes-bootcamp 0/1 1 0 30m
[root@minikube ~]# kubectl get pods
[root@minikube ~]# kubectl describe pod
[root@minikube ~]# kubectl get pod
……
[root@minikube ~]# kubectl logs k8s-nginx-6ff5777d4b-p5tb4 #注:查看pod日志
#注:在容器中执行命令
[root@minikube ~]# kubectl exec k8s-nginx-6ff5777d4b-p5tb4 env #注:查看pod内部环境变量
[root@minikube ~]# kubectl exec k8s-nginx-6ff5777d4b-p5tb4 -it /bin/bash #注:进入容器内部
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@k8s-nginx-6ff5777d4b-p5tb4:/#
root@k8s-nginx-6ff5777d4b-p5tb4:/# curl 127.0.0.1:80 #注:nginx容器 提供web服务
……
root@k8s-nginx-6ff5777d4b-p5tb4:/# exit #注:退出容器
命令
kubectl create deployment
kubectl get pod/node
kubectl describe
kubectl logs
kubectl exec
kubectl cluster-info
kubectl --help
kubectl exec k8s-nginx-6ff5777d4b-p5tb4 -it /bin/bash
·ClusterIP (默认) - 在集群的内部 IP 上公开 Service 。这种类型使得 Service 只能从集群内访问
·NodePort - 使用 NAT 在集群中每个选定 Node 的相同端口上公开 Service 。使用: 从集群外部访问 Service。是 ClusterIP 的超集
·LoadBalancer - 在当前云中创建一个外部负载均衡器(如果支持的话),并为 Service 分配一个固定的外部IP。是 NodePort 的超集
[root@minikube ~]# kubectl get pod
[root@minikube ~]# kubectl get service #注:查看服务
[root@minikube ~]# kubectl get deployment #注:查看deployment部署器
[root@minikube ~]# kubectl delete deployment k8s-nginx #注:删除deployment
[root@minikube ~]# kubectl --help
#注:创建deployment部署器 指定副本 3个
[root@minikube ~]# kubectl create deployment sc-k8s-nginx --image=nginx --replicas=3
暴露服务 (服务发布)
模式:NodePoint
1 .创建pod
#注:创建deployment部署器 指定副本 3个
[root@minikube ~]# kubectl create deployment sc-k8s-nginx --image=nginx -r 3
[root@minikube ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
sc-k8s-nginx 3/3 3 3 18s
2 .创建服务,类型为NodePort
[root@minikube ~]# kubectl expose deployment/sc-k8s-nginx --type="NodePort" --port 80
#注:--port 80 是容器里暴露的端口 --> nginx启动时默认的监听端口,此端口不要乱填,不然会导致访问不了服务
[root@minikube ~]# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
sc-k8s-nginx NodePort 10.99.44.214 <none> 80:30597/TCP 12s
[root@minikube ~]# curl 192.168.0.7:30597 #注:访问
<!DOCTYPE html>
……
</html>
[root@minikube ~]# iptables -P FORWARD ACCEPT #注:解决k8s的nodePort,外网不能访问
#注:iptables里的FORWARD链 默认规则需要修改为ACCEPT --> 导致从外网访问暴露的端口访问不了,本机可以访问
Chrome浏览器:http://192.168.0.7:30597/ 访问成功
kube-prox帮实现背后负载均衡策略
kube-proxy三种代理模式:userspace, iptables, ipvs
[root@minikube ~]# kubectl get service #注:可以得到节点服务器上的端口号
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
sc-k8s-nginx NodePort 10.99.44.214 <none> 80:30597/TCP 3h2m
[root@minikube ~]# kubectl describe service sc-k8s-nginx #注:查看服务的详细信息
Type: NodePort
IP: 10.99.44.214
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 30597/TCP
Endpoints: 172.17.0.2:80,172.17.0.3:80,172.17.0.4:80
[root@minikube ~]# lsof -i:30597
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
kube-prox 4732 root 11u IPv6 296814 0t0 TCP *:30597 (LISTEN)
扩缩pod
#示例:增加pod
[root@minikube ~]# kubectl scale deployment/sc-k8s-nginx --replicas 10
#示例:减少pod
[root@minikube ~]# kubectl scale deployment/sc-k8s-nginx --replicas 3
[root@minikube ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
sc-k8s-nginx 3/3 3 3 4h17m
[root@minikube ~]# kubectl scale deployment/sc-k8s-nginx --replicas 10 #注:增加pod
[root@minikube ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
sc-k8s-nginx 10/10 10 10 4h19m
[root@minikube ~]# kubectl scale deployment/sc-k8s-nginx --replicas 3 #注:减少pod
[root@minikube ~]# kubectl get pod -o wide #注:可以显示更加多的字段和信息;显示pod详细信息
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
sc-k8s-nginx-5ffbfd68f7-dxrw9 1/1 Running 0 4h21m 172.17.0.2 minikube <none> <none>
……
镜像的升级和回滚 (滚动更新 Rolling Updates)
镜像的升级和回滚 (滚动更新 Rolling Updates)
升级:从低到高版本
回滚:从高到低版本
#示例:镜像的滚动升级
[root@minikube ~]# kubectl set image deployment/k8s-nginx-1.18 nginx=nginx:1.19.7
#示例:回滚
[root@minikube ~]# kubectl rollout undo deployment/k8s-nginx-1.18
#注:创建部署器deployment,起4个pod
[root@minikube ~]# kubectl create deployment k8s-nginx-1.18 --image=nginx:1.18.0 -r 4
[root@minikube ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
k8s-nginx-1.18 4/4 4 4 2m3s
[root@minikube ~]# kubectl get pod -o wide #注:可以查看pod的ip地址
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
k8s-nginx-1.18-847f5db69-5q6b6 1/1 Running 0 2m42s 172.17.0.9 minikube <none> <none>
……
[root@minikube ~]# curl 172.17.0.9
<!DOCTYPE html>
……
[root@minikube ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
k8s-nginx-1.18 4/4 4 4 10m
#注:镜像的滚动升级
[root@minikube ~]# kubectl set image deployment -l app=k8s-nginx-1.18 nginx=nginx:1.19.7
#注:另一个写法(推荐):kubectl set image deployment/k8s-nginx-1.18 nginx=nginx:1.19.7
[root@minikube ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
k8s-nginx-1.18-6776d9d4b7-h4p58 1/1 Running 0 85s
……
[root@minikube ~]# kubectl describe pod k8s-nginx-1.18-6776d9d4b7-h4p58 #注:滚动升级成功
……
Image: nginx:1.19.7
[root@minikube ~]# kubectl rollout status deployments/k8s-nginx-1.18 #注:查看滚动升级的状态
deployment "k8s-nginx-1.18" successfully rolled out
#注:升级到一个不存在的镜像的版本,会出错
[root@minikube ~]# kubectl set image deployment/k8s-nginx-1.18 nginx=nginx:2.10.1
[root@minikube ~]# kubectl rollout status deployments/k8s-nginx-1.18
Waiting for deployment "k8s-nginx-1.18" rollout to finish: 2 out of 4 new replicas have been updated...
[root@minikube ~]# kubectl get pod #注:升级失败
NAME READY STATUS RESTARTS AGE
k8s-nginx-1.18-c6586d4b9-5ds2h 0/1 ImagePullBackOff 0 30s
……
ImagePullBackOff表示镜像文件pull不下来
#注:回滚
[root@minikube ~]# kubectl rollout undo deployment/k8s-nginx-1.18
[root@minikube ~]# kubectl get pod #注:回滚成功
NAME READY STATUS RESTARTS AGE
k8s-nginx-1.18-6776d9d4b7-h4p58 1/1 Running 0 11m
……
conctroller - 控制器
conctroller - 控制器
deployment
滚动升级 rolling upgrade
回滚 rollout
ReplicaSet - 副本的控制器
问题:
swap分区
minikube的时候 --> 禁用swap分区
[root@minikube ~]# free -m #注:查看内存的使用
total used free shared buff/cache available
Mem: 3752 1175 1150 10 1425 2404
Swap: 0 0 0
#注:free -m可以查看swap分区是否使用
[root@minikube ~]# swapoff -a #注:临时关闭swap分区
[root@minikube ~]# vim /etc/fstab #注:永久关闭swap分区
#/dev/mapper/cl-swap swap swap defaults 0 0
namespace
什么是namespace?
内核管理内存,从内存里划分出一个独立的区域,给它起一个名字,然后可以在这个空间里存放你的数据,数据可以是一个容器,也可以是2个容器,也可以是多个容器,容器里运行镜像,镜像里是代码
在一个固定的空间里,存放你的数据(对象),这个对象你可以起名字 --> 隔离性
[root@minikube ~]# kubectl create namespace sc-namespace #注:创建命名空间
#注:创建部署器,指定命名空间
[root@minikube ~]# kubectl create deployment k8s-nginx-wang --image=nginx -r 2 --namespace sc-namespace
[root@minikube ~]# kubectl get namespace
NAME STATUS AGE
default Active 2d17h
kube-node-lease Active 2d17h
kube-public Active 2d17h
kube-system Active 2d17h
[root@minikube ~]# kubectl get pod -A #注:可以知道pod在哪个命名空间里
[root@minikube ~]# kubectl create namespace sc-namespace #注:创建命名空间
#注:创建部署器,指定命名空间
[root@minikube ~]# kubectl create deployment k8s-nginx-wang --image=nginx -r 2 --namespace sc-namespace
[root@minikube ~]# kubectl get pod #注:查看default命名空间里的pod
[root@minikube ~]# kubectl get pod -A #注:查看所有命名空间里的pod
[root@minikube ~]# kubectl get pod --namespace sc-namespace #注:查看sc-namespace命名空间里的pod
NAME READY STATUS RESTARTS AGE
k8s-nginx-wang-6858fd55d8-2f24c 1/1 Running 0 85s
k8s-nginx-wang-6858fd55d8-ht9ll 1/1 Running 0 85s
[root@minikube ~]# kubectl get pod -o wide #注:查看default命名空间里的pod详细信息
[root@minikube ~]# kubectl get pod -o wide -A #注:查看所有命名空间里的pod的详细信息
容器在不同的命名空间物理上是隔离的,但是使用的网络是同一个网段(相同的网络)
#注:进入容器
[root@minikube ~]# kubectl exec k8s-nginx-wang-6858fd55d8-2f24c --namespace=sc-namespace -it /bin/bash
root@k8s-nginx-wang-6858fd55d8-2f24c:/# curl 172.17.0.12 #注:可以访问其他命名空间里的容器
[root@minikube ~]# kubectl describe pod sc-k8s-nginx-5ffbfd68f7-2dpbk
……
容器启动时 使用外面的配置文件 --> 如何把外面的东西挂载到里面去
k8s里面使用configmap实现
使用 ConfigMap 来配置 Redis
https://kubernetes.io/zh/docs/tutorials/configuration/configure-redis-using-configmap/
1 .根据redis-config来创建一个ConfigMap
[root@minikube ~]# mkdir pods/config -p
[root@minikube ~]# cd pods/config/
[root@minikube config]# vim redis-config #注:定义了2个变量;最大内存、内存置换策略
maxmemory 2mb
maxmemory-policy allkeys-lru
[root@minikube config]# cat <./kustomization.yaml
> configMapGenerator: #注:生成一个configMap (Generator 生成器)
> - name: example-redis-config
> files:
> - redis-config
> EOF
将 pod 的资源配置添加到 kustomization.yaml 文件中
[root@minikube config]# vim redis-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: redis
spec:
containers:
- name: redis
image: redis:5.0.4
command:
- redis-server
- "/redis-master/redis.conf"
env:
- name: MASTER
value: "true"
ports:
- containerPort: 6379
resources:
limits:
cpu: "0.1"
volumeMounts:
- mountPath: /redis-master-data
name: data
- mountPath: /redis-master
name: config
volumes:
- name: data
emptyDir: {}
- name: config
configMap:
name: example-redis-config
items:
- key: redis-config
path: redis.conf
[root@minikube config]# cat <>./kustomization.yaml
> resources:
> - redis-pod.yaml
> EOF
应用整个 kustomization 文件夹以创建 ConfigMap 和 Pod 对象
[root@minikube config]# kubectl apply -k .
使用以下命令检查创建的对象
[root@minikube config]# kubectl get -k .
NAME DATA AGE
configmap/example-redis-config-dgb8m46g6g 1 41s
NAME READY STATUS RESTARTS AGE
pod/redis 1/1 Running 0 41s
使用 kubectl exec 进入 pod 并运行 redis-cli 工具来验证配置已正确应用
[root@minikube config]# kubectl exec -it redis -- redis-cli
127.0.0.1:6379> CONFIG GET maxmemory
1) "maxmemory"
2) "2097152"
127.0.0.1:6379> CONFIG GET maxmemory-policy
1) "maxmemory-policy"
2) "allkeys-lru"
127.0.0.1:6379> exit
[root@minikube config]# kubectl exec -it redis -- bash
root@redis:/data# pwd
/data
root@redis:/data# cd /
root@redis:/# ls
bin data etc lib media opt redis-master root sbin sys usr
boot dev home lib64 mnt proc redis-master-data run srv tmp var
root@redis:/# cd redis-master
root@redis:/redis-master# ls
redis.conf
root@redis:/redis-master# cat redis.conf
maxmemory 2mb
maxmemory-policy allkeys-lru
删除创建的 pod
kubectl delete pod redis
无状态的应用 (stateless-application)
1 .是指该服务运行的实例不会在本地存储需要持久化的数据,并且多个实例对于同一个请求响应的结果是完全一致的。
2 .多个实例可以共享相同的持久化数据。例如:nginx实例,tomcat实例等
3 .相关的k8s资源有:ReplicaSet、ReplicationController、Deployment等,由于是无状态服务,所以这些控制器创建的pod序号都是随机值。并且在缩容的时候并不会明确缩容某一个pod,而是随机的,因为所有实例得到的返回值都是一样,所以缩容任何一个pod都可以。
web服务 --> 不记录是否曾经连接过,不知道是新的访问还是老的访问
HTTP连接就是无状态 --> keepalive 65
长连接
短连接:如 三次握手、四次断开
有状态的应用 (stateful)
有状态服务 可以说是 需要数据存储功能的服务、或者指多线程类型的服务,队列等。(mysql数据库、kafka、zookeeper等)
每个实例都需要有自己独立的持久化存储
pv --> 存储
pvc --> 使用存储
持久卷 (Persistent Volume,PV)
https://kubernetes.io/zh/docs/concepts/storage/persistent-volumes/
PV的3种访问模式: ReadWriteOnce、ReadOnlyMany 或 ReadWriteMany
PV的类型
本地
hostPath 在宿主机里搞一个文件夹共享
消耗宿主机的磁盘空间
EmptyDir 本地卷搞一个空的文件夹存放数据
步骤:在 Shell 中,创建一个 /mnt/data 目录;在 /mnt/data 目录中创建一个 index.html 文件
[root@minikube ~]# mkdir /mnt/data
[root@minikube ~]# cd /mnt/data/
[root@minikube data]# echo 'Hello from Kubernetes storage' > /mnt/data/index.html
步骤:创建 PersistentVolume
#注:hostPath PersistentVolume 的配置文件
[root@minikube data]# mkdir /pod/storage -p
[root@minikube data]# cd /pod/storage/
[root@minikube storage]# vim pv-volume.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: sc-pv-volume
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
#注:创建 PersistentVolume
[root@minikube storage]# kubectl apply -f pv-volume.yaml
#注:查看 PersistentVolume 的信息
[root@minikube storage]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
sc-pv-volume 10Gi RWO Retain Available manual 10s
步骤:创建 PersistentVolumeClaim
#注:PersistentVolumeClaim 的配置文件
[root@minikube storage]# vim pv-claim.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: sc-pv-claim
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
#注:创建 PersistentVolumeClaim
[root@minikube storage]# kubectl apply -f pv-claim.yaml
#注:查看 PersistentVolume 信息
[root@minikube storage]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
sc-pv-claim Bound sc-pv-volume 10Gi RWO manual 11s
步骤:创建 Pod
#注:Pod 的 配置文件
[root@minikube storage]# vim pv-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: sc-pv-pod
spec:
volumes:
- name: sc-pv-storage
persistentVolumeClaim:
claimName: sc-pv-claim
containers:
- name: sc-pv-container
image: nginx
ports:
- containerPort: 80
name: "http-server"
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: sc-pv-storage
#注:创建 Pod
[root@minikube storage]# kubectl apply -f pv-pod.yaml
pod/sc-pv-pod created
[root@minikube storage]# kubectl get pod
NAME READY STATUS RESTARTS AGE
sc-pv-pod 1/1 Running 0 9s
#注:访问 Pod 中的容器;验证 nginx 是否正在从 hostPath 卷提供 index.html 文件
[root@minikube storage]# kubectl exec -it sc-pv-pod -- bash
root@sc-pv-pod:/# cd /usr/share/nginx/html/
root@sc-pv-pod:/usr/share/nginx/html# cat index.html
Hello from Kubernetes storage
root@sc-pv-pod:/usr/share/nginx/html# curl 127.0.0.1
Hello from Kubernetes storage
[root@minikube storage]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
sc-pv-pod 1/1 Running 0 3m13s 172.17.0.20 minikube <none> <none>
[root@minikube storage]# curl 172.17.0.20
Hello from Kubernetes storage
步骤:清理
删除 Pod、PersistentVolumeClaim 和 PersistentVolume 对象
kubectl delete pod sc-pv-pod
kubectl delete pvc sc-pv-claim
kubectl delete pv sc-pv-volume
#注:问题:单独起的pod,没有借助deployment去部署,暴露出去 暴露不了
k8s数据持久化-pv和pvc—NFS实现
https://www.cnblogs.com/wangxu01/articles/11671092.html
具体的配置-pv-pvc-pod-nfs
#步骤:配置nfs
[root@nfs-server ~]# yum install -y nfs-utils #注:安装nfs-master
[root@nfs-server ~]# mkdir -p /data/web #注:在master节点创建共享目录
[root@nfs-server ~]# vim /etc/exports #注:编辑/etc/exports配置文件
/data 192.168.0.0/24(rw,no_root_squash,no_all_squash,sync)
[root@nfs-server ~]# cp /etc/passwd /data/
[root@nfs-server ~]# exportfs -rv #注:共享
[root@nfs-server ~]# service nfs-server start #注:启动nfs-server服务
[root@nfs-server ~]# chmod 777 /data/
[root@nfs-server ~]# echo "hello,sc" >>/data/index.html #注:挂载的主页内容
#步骤:在nodes安装nfs客户端
#注:node节点上 和data目录无关
[root@minikube data]# yum install -y nfs-utils
[root@minikube data]# service nfs-server start #注:不清楚要不要启动
#步骤:创建PV-持久卷
[root@minikube data]# vim pv-nfs.yaml
apiVersion: v1
kind: PersistentVolume #资源类型
metadata:
name: sc-nginx-pv
labels:
type: sc-nginx-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany #访问模式,多个客户端读写
persistentVolumeReclaimPolicy: Recycle #回收策略-可以回收
storageClassName: nfs #注:指定存储卷的类型
nfs:
path: "/data"
server: 192.168.0.112 #k8s-nfs matser
readOnly: false #不是只读
[root@minikube data]# kubectl apply -f pv-nfs.yaml #注:应用
#注:查看PV信息
[root@minikube data]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
sc-nginx-pv 5Gi RWX Recycle Bound default/sc-nginx-pvc nfs 10h
#步骤:创建PVC-持久卷消费者
[root@minikube data]# vim pvc-nfs.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: sc-nginx-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
storageClassName: nfs
[root@minikube data]# kubectl apply -f pvc-nfs.yaml #注:生成
[root@minikube data]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
sc-nginx-pvc Bound sc-nginx-pv 5Gi RWX nfs 10s
#步骤:创建pod使用它们
[root@minikube data]# cp /pod/storage/pv-pod.yaml .
[root@minikube data]# vim pv-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: sc-pv-pod-nfs #注:pod名字
spec:
volumes:
- name: sc-pv-storage-nfs
persistentVolumeClaim:
claimName: sc-nginx-pvc #注:定义卷 使用这个pvc去申请空间
containers:
- name: sc-pv-container-nfs
image: nginx
ports:
- containerPort: 80
name: "http-server"
volumeMounts:
- mountPath: "/usr/share/nginx/html" #注:挂载点
name: sc-pv-storage-nfs #注:使用上面卷的名字,把卷挂到挂载点
[root@minikube data]# kubectl apply -f pv-pod.yaml #注:应用
[root@minikube data]# kubectl get pod
……
[root@minikube data]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
sc-pv-pod-nfs 1/1 Running 0 32s 172.17.0.21 minikube <none> <none>
#注:测试
[root@minikube data]# curl 172.17.0.20
hello,sc
#注:全部删除
[root@minikube data]# kubectl delete pod sc-pv-pod-nfs
[root@minikube data]# kubectl delete pvc sc-nginx-pvc
[root@minikube data]# kubectl delete pv sc-nginx-pv
#注:全部重来
[root@minikube data]# kubectl apply -f pv-nfs.yaml
[root@minikube data]# kubectl apply -f pvc-nfs.yaml
[root@minikube data]# kubectl apply -f pv-pod.yaml
flannel
Docker 跨主机网络overlay、macvlan和flannel
https://blog.csdn.net/wfs1994/article/details/80659232
flannel 是 CoreOS 开发的容器网络解决方案。flannel 为每个 host 分配一个 subnet,容器从此 subnet 中分配 IP,这些 IP 可以在 host 间路由,容器间无需 NAT 和 port mapping 就可以跨主机通信
持续集成CI-持续交付-CD
集成:融合,组合到一起 --> 集合到一起,并且能够成功使用
持续集成 CI Continuous integration
持续交付 CD Continuous delivery
Gitlab --> 公司内部自己搞的一个类型GitHub的平台,不对外开放
GitHub或者Gitlab都是基于git的二次开发的软件
Gitlab官网
https://about.gitlab.com/
硬件环境的要求:
cpu:2c
memory:2g
软件环境的要求:
centos:8.2.2004
[root@k8s-master ~]# cat /etc/centos-release
CentOS Linux release 8.2.2004 (Core)
docker环境准备
# 准备3台虚拟机(centos-8)并运行以下脚本
[root@k8s-master ~]# vim docker.sh
#!/bin/bash
# 卸载旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
yum install -y yum-utils
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
systemctl start docker
systemctl enable docker
#配置 Docker 使用 systemd 作为默认 Cgroup 驱动
cat <<EOF > /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
#重启docker
systemctl restart docker
#关闭swap分区
swapoff -a # 临时
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab # 永久
# 修改主机名后使用su - root 重新登录
# su - root
cat >> /etc/hosts << EOF
192.168.0.81 k8s-master
192.168.0.82 k8s-node1
192.168.0.83 k8s-node2
EOF
#添加kubernetes YUM软件源
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
#安装kubeadm,kubelet和kubectl
yum install -y kubelet kubeadm kubectl
#设置开机自启
systemctl enable --now kubelet
#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
#关闭selinux
setenforce 0 #临时关闭
#永久关闭
sed -i '/^SELINUX/ s/enforcing/disabled/' /etc/selinux/config
[root@k8s-master ~]# bash docker.sh
[root@k8s-master ~]# scp docker.sh 192.168.0.82:/root
[root@k8s-master ~]# scp docker.sh 192.168.0.83:/root
[root@k8s-node1 ~]# bash docker.sh
[root@k8s-node2 ~]# bash docker.sh
master主机执行
# 部署Kubernetes Master
[root@k8s-master ~]# kubeadm init \
> --apiserver-advertise-address=192.168.0.81 \
> --image-repository registry.aliyuncs.com/google_containers \
> --service-cidr=10.1.0.0/16 \
> --pod-network-cidr=10.244.0.0/16
#注:输出结果
……
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.0.81:6443 --token uh55qi.s3o6osbg39tievph \
--discovery-token-ca-cert-hash sha256:9dde0a8c1940feb84380d502578ca75f9ef4e56f005f8b4ef673351981825c19
# 按照提示操作
[root@k8s-master ~]# mkdir -p $HOME/.kube
[root@k8s-master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
# node节点执行
[root@k8s-node1 ~]# kubeadm join 192.168.0.81:6443 --token uh55qi.s3o6osbg39tievph \
> --discovery-token-ca-cert-hash sha256:9dde0a8c1940feb84380d502578ca75f9ef4e56f005f8b4ef673351981825c19
[root@k8s-node2 ~]# kubeadm join 192.168.0.81:6443 --token uh55qi.s3o6osbg39tievph \
> --discovery-token-ca-cert-hash sha256:9dde0a8c1940feb84380d502578ca75f9ef4e56f005f8b4ef673351981825c19
[root@k8s-master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane,master 9m2s v1.20.4
k8s-node1 NotReady <none> 5m20s v1.20.4
k8s-node2 NotReady <none> 36s v1.20.4
安装网络插件(在master节点执行)
#注:部署flannel
[root@k8s-master ~]# ls
anaconda-ks.cfg docker.sh kube-flannel.yml
[root@k8s-master ~]# kubectl apply -f kube-flannel.yml
#注:查看集群状态
[root@k8s-master ~]# kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system kube-flannel-ds-2z8m2 1/1 Running 0 2m43s
kube-system kube-flannel-ds-jxzdl 1/1 Running 0 2m43s
kube-system kube-flannel-ds-qfngh 1/1 Running 0 2m43s
[root@k8s-master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,master 54m v1.20.4
k8s-node1 Ready <none> 50m v1.20.4
k8s-node2 Ready <none> 45m v1.20.4
#步骤:配置nfs
[root@k8s-nfs ~]# yum install nfs-utils -y
[root@k8s-nfs ~]# vim /etc/exports
/data 192.168.0.0/24(rw,no_root_squash,no_all_squash,sync)
[root@k8s-nfs ~]# mkdir /data/
[root@k8s-nfs ~]# chmod 777 /data/
[root@k8s-nfs ~]# service nfs-server restart
[root@k8s-nfs ~]# exportfs -rv
[root@k8s-nfs ~]# service firewalld stop
[root@k8s-nfs ~]# systemctl disable firewalld
[root@k8s-nfs ~]# setenforce 0
[root@k8s-nfs ~]# sed -i '/^SELINUX/ s/enforcing/disabled/' /etc/selinux/config
[root@k8s-nfs ~]# systemctl enable nfs-server
[root@k8s-nfs ~]# cd /data/
[root@k8s-nfs data]# echo "hello,sc,k8s" >>index.html
[root@k8s-nfs data]# cat index.html
hello,sc,k8s
#步骤:节点安装nfs客户端
[root@k8s-master ~]# yum install nfs-utils -y
[root@k8s-node1 ~]# yum install nfs-utils -y
[root@k8s-node2 ~]# yum install nfs-utils -y
#步骤:创建PV-持久卷、PVC-持久卷消费者、使用deployment起pod
[root@k8s-master ~]# mkdir pv-pvc-pod-nfs
[root@k8s-master ~]# cd pv-pvc-pod-nfs/
#注:PV-持久卷
[root@k8s-master pv-pvc-pod-nfs]# vim pv-nfs.yaml
apiVersion: v1
kind: PersistentVolume #资源类型
metadata:
name: sc-nginx-pv
labels:
type: sc-nginx-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany #访问模式,多个客户端读写
persistentVolumeReclaimPolicy: Recycle #回收策略-可以回收
storageClassName: nfs #注:指定存储卷的类型
nfs:
path: "/data"
server: 192.168.0.84 #k8s-nfs matser
readOnly: false #不是只读
#注:PVC-持久卷消费者
[root@k8s-master pv-pvc-pod-nfs]# vim pvc-nfs.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: sc-nginx-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
storageClassName: nfs
#注:使用deployment起pod
[root@k8s-master pv-pvc-pod-nfs]# vim new-pod-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend-nginx
spec:
replicas: 5
selector:
matchLabels:
app: hello
tier: backend-nginx
track: stable
template:
metadata:
labels:
app: hello
tier: backend-nginx
track: stable
spec:
containers:
- name: sc-pv-container-nfs
image: nginx
ports:
- containerPort: 80
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: sc-pv-storage-nfs
volumes:
- name: sc-pv-storage-nfs
persistentVolumeClaim:
claimName: sc-nginx-pvc
#注:创建PV-持久卷、PVC-持久卷消费者、使用deployment起pod
[root@k8s-master pv-pvc-pod-nfs]# kubectl apply -f pv-nfs.yaml
[root@k8s-master pv-pvc-pod-nfs]# kubectl apply -f pvc-nfs.yaml
[root@k8s-master pv-pvc-pod-nfs]# kubectl apply -f new-pod-nginx.yaml
相关操作
[root@k8s-master pv-pvc-pod-nfs]# kubectl get pod
……
[root@k8s-master pv-pvc-pod-nfs]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
backend-nginx 5/5 5 5 34m
[root@k8s-master pv-pvc-pod-nfs]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
backend-nginx-84ff6bfd47-6jxzc 1/1 Running 0 30m 10.244.2.7 k8s-node2
……
[root@k8s-master pv-pvc-pod-nfs]# curl 10.244.2.7 #注:测试成功
hello,sc,k8s
ingress
ingress
七层负载均衡的工具
https://kubernetes.io/zh/docs/concepts/services-networking/ingress/
基于url的负载均衡
一个扇出(fanout)配置根据请求的 HTTP URI 将来自同一 IP 地址的流量路由到多个 Service
基于域名(名称)的虚拟托管