31_linux笔记-k8s

文章目录

  • 安装minikube
  • 暴露服务
  • 实验:配置 Pod 以使用 PersistentVolume 作为存储
  • 案例:通过NFS实现持久化存储
  • 实验:多节点集群部署

个人博客
https://blog.csdn.net/cPen_web


Kubernetes k8s

Kubernetes	k8s
	生成级别的容器编排工具

https://kubernetes.io/
https://www.kubernetes.org.cn/course
https://kubernetes.io/docs/tutorials/kubernetes-basics/


安装minikube

安装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		本地卷搞一个空的文件夹存放数据

实验:配置 Pod 以使用 PersistentVolume 作为存储

步骤:在 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去部署,暴露出去 暴露不了

案例:通过NFS实现持久化存储

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
基于域名(名称)的虚拟托管

你可能感兴趣的:(Linux笔记,k8s)