定义:容器是容器image运行时的实例。
通俗的理解:软件界的集装箱(隔离、封装)。
OCI:Open Container Initiative
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dAyu1S4q-1629344919913)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\1627520721389.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SkwTWEh5-1629344919915)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\1627520861909.png)]
Docker主要指容器引擎,即Docker engine。、
Docker Engine是一个Client/Server应用程序。Docker engine主要组件有3部分:
服务器:是一个长期运行的程序,称为daemon进程。
命令行界面客户端(docker CLI):
一个REST API:Client可以用它来与daemon进程通信交互
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m0pMr3g4-1629344919915)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\1627521063648.png)]
Docker Client:Docker是个采用的C/S架构的应用程序。Docker Client一般通过Docker command来发起请求。在用户界面,支持用户与Docker Daemon之间通信。
Docker daemon:简单地说,Docker daemon实现的功能就是接收客户端发来的请求,并实现请求所要求的功能,同时针对请求返回相应的结果。Docker daemon是驱动整个Docker功能的核心引擎。在功能的实现上,Docker daemon涉及了容器、镜像、存储等多方面的内容,涉及多个模块的实现和交互。
Containers:
容器以镜像为基础,同时又为镜像提供了一个标准和隔离的运行环境。
Docker的容器就是“软件界的集装箱”,可以安装任意的软件和库文件,做任意的运行环境配置。开发及运维人员在转移和部署应用的时候,不需关心容器里装了什么软件,也不需了解它们是如何配置的。
Docker Image:与容器相对应,如果说容器提供了一个完整的、隔离的运行环境,那么镜像则是这个运行环境的静态体现。
Registry:Registry是一个存放镜像的仓库。Registry本身也是一个单独的开源项目,企业可使用Registry镜像搭建私有仓库。
https://hub.docker.com提供公用镜像
(1)docker create
查看镜像:
docker search httpd
到https://hub.docker.com去查找
创建时,会自动下载镜像
docker create --name 容器名字 镜像名[:tag]
查看本地镜像:
docker image ls
docker images
docker seach httpd
(2)docker run ##创建并运行命令
docker run -d -p 8080:80 httpd
-d 后台运行
-p 宿主机与容器的端口映射
-it 在容器启动时,通过命令行进入容器并进行交互
docker ps -a 查看所有容器
docker ps 或docker container ls 查看所有运行的容器
docker start name/containerid
docker stop name/containerid
docker create 创建容器
docker start
docker run
docker pause 暂停
docker unpause 恢复容器
docker restart 重启容器
docker stop 停止容器
docker rm 删除一个处于中止的容器,-f强制删除
docker kill 杀死容器进程
docker container prune 删除所有中止的容器
docker attach命令
docker attach命令直接进入已启动容器的命令终端,不会启动新的进程。
Usage:docker attach [OPTIONS] CONTAINER
注意:
正确推出CTRL+P+Q,
如果使用exit,或者CTRL+d,会导致容器停止
docker exec命令
docker exec命令是在容器中打开新的终端。
Usage:docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
docker exec -it sxq bash
kernel:Linux系统内核
容器镜像是容器的模板,容器是镜像的运行实例,runtime根据容器镜像创建容器
1、base镜像
2、容器镜像分层结构:
container Layer:容器层R/W
Image Layer:镜像层 R/O
docker search 搜索镜像
docker pull :下载镜像
docke push :上传镜像
docker images 或docker image ls :查看镜像
docker history nginx:v1.1 显示镜像构建过程
docker commit 构建镜像
构建镜像:
docker commit [options] contianer img:tag
options:
-a :镜像作者
-m:注释信息
-p:在commit时,将容器暂停
-c:使用dockerfile创建镜像
docker commit -a [email protected] -m updatemessage nginx1 nginx:v1.1
编写dockerfile文件
docker build -t http:v11 -f dockerfile1 /root
导出为tar文件:
docker image save imagename:tag > [path][flie.tar]
导入:
docker load < **.tar
tar -cvpf ubunt.tar --directory --exclude=sys --exclude=dev --exclude=run --exclude=boot
cat ubunt.tar | docker import - ubuntu:18.04
创建一个文件夹,作为镜像库存储空间
创建容器,使用docker hub上的registry镜像,这个镜像是用于构建本地的私有仓库
docker run -d -p 1000:5000 -v /root/myregister/:/var/lib/registry registry
镜像符合镜像库要求:
[host]:[port]/[username]/[registry:tag]
docker tag httpd:v11 127.0.0.1:1000/sxq/httpd:v12
docker push127.0.0.1:1000/sxq/httpd:v12
curl 127.0.0.1:1000/v2/_catlog
docker login
docker commit containerID/name dockerID/imagename:tag
docker push dockerID/imagename:tag
模型 | 说明 |
---|---|
None | none网络中的容器,不能与外部通信。 |
Host | 容器加入到宿主机的Network namespace,容器直接使用宿主机网络。 |
Bridge | 默认网络驱动程序。主要用于多个容器在同一个Docker宿主机上进行通信。 |
Overlay | Overlay网络可基于Linux网桥和Vxlan,实现跨主机的容器通信。 |
Macvlan | Macvlan用于跨主机通信场景。 |
##查看容器网络
docker network ls
##查看net2详细信息
docker network inspect net2
##创建bridge子网为172.10.10.0/24网关为172.10.10.1的net2
docker network create --driver bridge --subnet 172.10.10.0/24 --gateway 172.10.10.1 net2
##创建centos2网络空间为net2
docker run --name centos2 -dit --network=net2 centos
##创建centos2网络空间为net2,固定IP172.10.10.10
docker run --name centos3 -dit --network=net2 --ip 172.10.10.10 centos
(1)Storage driver:管理镜像层和容器层
Storage driver处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户提供了多层数据合并后的统一视图。
所有Storage driver都使用可堆叠图像层和写时复制(CoW)策略。
docker info命令可查看当前系统上的storage driver。
(2)docker容器中持久化数据一般采用两种存储方式:
(3)volume由Docker管理,是将特定目录挂载给容器。
(4) bind mount是将宿主机上已有的目录或文件mount到容器中。
docker run --name huawei2 -d -p 8081:80 -v /root/htdocs:/usr/local/apache2/htdocs:ro httpd
docker run --name huawei3 -d -p 8082:80 -v /root/htdocs/:/usr/local/apache2/htdocs httpd
(1)主机与容器数据共享:
(2)容器间数据共享
Nmespace类型 | 系统调用参数 | 隔离内容 | 引入的内核版本 |
---|---|---|---|
PID namespace | CLONE_NEWPID | 进程空间(进程ID) | Linux 2.6.24 |
Mount namespace | CLONE_NEWNS | 文件系统挂载点 | Linux 2.6.19 |
Network namespace | CLONE_NEWNET | 网络资源:网络设备、端口等 | 始于Linux 2.6.24完成于Linux 2.6.29 |
User namespace | CLONE_NEWUSER | 用户ID和用户组ID | 始于Linux 2.6.23完成于Linux 3.8 |
UTS namespace | CLONE_NEWUTS | 主机名和域名 | Linux 2.6.19 |
IPC namespace | CLONE_NEWIPC | 信号量、消息队列和共享内存 | Linux 2.6.19 |
###实践
docker run -h hwhost -it centos
[root@hwhost /]# touch sxq
[root@hwhost /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sxq sys tmp usr var
[root@hwhost /]# ps axf
PID TTY STAT TIME COMMAND
1 pts/0 Ss 0:00 /bin/bash
19 pts/0 R+ 0:00 ps axf
[root@hwhost /]# useradd sxq
[root@hwhost /]# id sxq
uid=1000(sxq) gid=1000(sxq) groups=1000(sxq)
###登录宿主主机查看
[root@localhost ~]# docker inspect 669 |grep -i pid
"Pid": 118015,
"PidMode": "",
"PidsLimit": 0,
[root@localhost ~]# ps axf |grep 118015
118015 pts/0 Ss+ 0:00 | \_ /bin/bash
126210 pts/2 S+ 0:00 | | \_ grep --color=auto 118015
作用:限制一个进程组对系统资源的使用上限,包括CPU、内存、Block I/O等。
原理:将一组进程放在一个Cgroup中,通过给这个Cgroup分配指定的可用资源,达到控制这一组进程可用资源的目的。
实现:在Linux,以的cgroupcgroup
可通过如下参数,对容器的可用CPU资源进行限制:
###启动容器并进行cpu测试
docker run --name sxq1 -it --cpu-shares 512 progrium/stress --cpu 1
docker run --name sxq2 -it --cpu-shares 2048 progrium/stress --cpu 1
###新开窗口使用top或docker status命令查看
top
docker status
##查看限制文件
docker ps -a
cd /sys/fs/cgroup/xcpu/docker/
ll
cd 151(sxq容器对应的id)
cat cpu.share
cd edf(sxq容器对应的id)
cat cpu.share
cat task 查看进程ID
###启动容器并进行内存测试:内存为400 swap为50,--memory-swap=-1为不限制
docker run --name sxq1 -it -m 400M --memory-swap 450M centos -dit /bin/bash
架构:
命名空间:
Kubernetes 支持多个虚拟集群,它们底层依赖于同一个物理集群。 这些虚拟集群被称为命名空间。
命名空间提供了良好的资源隔离,可以用于区分不通的项目、用户等。如开发测试使用的namespace,或者生产使用的namespace。
使用如下命令可以查看哪些对象在命名空间中
kubectl api-resoureces --namesapce=true
从小到大的管理逻辑
容器
2、创建Deploment
创建一个简单的deployment
kubectl create deployment mydep --image=nginx
完成后我们使用如下语句查看deployment的创建情况
kubectl get deployment -o wide -w
kubectl get rs
kubectl get pod
kubectl get all
kubectl describe deploment mydep
apiVersion:版本号,固定为apps/v1,如果使用1.9.0以前版本的kubernetes,填写apps/v1beta2
Kind: 类型,选择创建资源类型,可以填写pod,replicaset等
Metadata:元数据,其中name项指定了名称,label项指定标签。
Spec:deployment规格,其中replicas指定pod副本数量,选择器选择标签匹配为app:nginx
Template:对pod模板的定义,其中至少要定义一个label
Spec:描述pod的规格
Containers:定义容器的属性,在范例中,容器名字是nginx,镜像为nginx:1.7.9,容器输入输出的端口是80端口。
最后注意格式,缩进一般使用两个空格,千万不要使用tab!
#样例
##apiVersion:1.9.0以前版本为apps/v1 beta2
apiVersion:1.9 apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
##副本数量和模板
spec:
###副本数量
replicas: 3
###匹配标签
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
###指定pod规格
spec:·
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
###查询相关参数
kubectl explain Deployment.spec.replicas
kubectl apply -f 文件名
当使用的deployment需要升级时(如软件版本更新),可以使用rolling update功能滚动升级deployment中所有pod。
#修改镜像版本
kubectl apply -f 文件名 --record
##查看升级信息
kubectl get deployment -0 wide
kubectl get rs
##查看历史信息
kubectl describe deploment
###查看回滚信息
kubectl rollout history deployment nginx-deployment
kubectl rollout history deployment nginx-deployment --revision=2
##回滚历史版本
kubectl rollout undo deployment nginx-deployment --to--revision=2
kubectl get deployment -o wide
只包含一个应用容器的pod
包含多个应用的pod
一个pod中会分配一个pause容器,这也被称为根容器。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-phEQtUW7-1629344919917)(C:\Users\admin\Desktop\华为认证培训\HCIA云计算\笔记思维导图\1628489826200.png)]
挂起(Pending):Pod 已被 Kubernetes 系统接受,但有一个或者多个容器镜像尚未创建。等待时间包括调度 Pod 的时间和通过网络下载镜像的时间,这可能需要花点时间。
运行中(Running):该 Pod 已经绑定到了一个节点上,Pod 中所有的容器都已被创建。至少有一个容器正在运行,或者正处于启动或重启状态。
成功(Succeeded):Pod 中的所有容器都被成功终止,并且不会再重启。
失败(Failed):Pod 中的所有容器都已终止了,并且至少有一个容器是因为失败终止。也就是说,容器以非0状态退出或者被系统终止。
未知(Unknown):因为某些原因无法取得 Pod 的状态,通常是因为与 Pod 所在主机通信失败。
1、创建yaml文件
kind: Pod
apiVersion: v1
metadata:
name: mypod
spec:
containers:
- name: mypod
image: busybox
args:
- /bin/sh
- -c
- sleep 30000
2、创建并查看
kubectl create -f mypod.yaml
###查看podID和运行节点
kubectl get pod -o wide
###查看完整信息
kubectl describe pod mypod
3、管理pod
#进入mypod的命令行,
kubectl exec -it mypod /bin/sh
#exec命令用于在容器中执行命令
#-it参数使得用户可以直接进入容器进行操作。
#在pod中可能存在多个容器,加入“--container 容器名“参数指定进入容器。
kubectl exec -it mypod --container mypod /bin/sh
#如果希望退出当前所在容器,可以输入exit回车退出
kubectl get pod --show-labels
kubectl label pod labelpod time=2019
标签不具备唯一性,在通常情况下,多个不同的对象有着相同的标签。
通过标签选择器,用户或客户端可以指定批量的对象进行操作。标签选择器也是kubernetes的核心分组方式。
目前支持两种标签选择器,基于等值的(equality-based)和基于集合的(set-based)。
基于等值的(equality-based)
kubectl get pods -l time=2019 --show-labels
基于集合的(set-based)
Kubectl label nodes k8s-node2 env=test
[root@k8s-master runfile]# kubectl get node -L env
NAME STATUS ROLES AGE VERSION ENV
k8s-master Ready master 21d v1.14.1
k8s-node1 Ready <none> 21d v1.14.1
k8s-node2 Ready <none> 21d v1.14.1 test
6、 使用Nodeselector选择节点
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
nodeSelector:
env: test
7、使用Node affinity
继续使用上一页的yaml文件,将nodeselector替换所示内容
###硬亲和
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: env
operator: In
values:
- test
###软亲和
affinity:
nodeAffinity:
perferredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: env
operator: In
values:
- test
Kubernetes Service 定义了这样一种抽象:逻辑上的一组 Pod,一种可以访问它们的策略 —— 通常称为微服务。 这一组 Pod 能够被 Service 访问到,通常是通过 Label Selector实现的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W5C9kI83-1629344919918)(C:\Users\admin\Desktop\华为认证培训\HCIA云计算\笔记思维导图\1628642936173.png)]
iptables
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LYtZ2yvm-1629344919919)(C:\Users\admin\Desktop\华为认证培训\HCIA云计算\笔记思维导图\1628643217313.png)]
IPVS
从k8s的1.8版本开始,kube-proxy引入了IPVS模式,IPVS模式与iptables实现方式类似,但是采用的hash表,因此当service数量达到一定规模时,hash查表的速度优势就会显现出来,从而提高service的服务性能 。
Service基数 | 1 | 5,000 | 20,000 |
---|---|---|---|
Rules基数 | 8 | 40,000 | 160,000 |
增加1条iptables规则 | 50us | 11min | 5hour |
增加1条ipvs规则 | 30us | 50us | 70us |
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LC2vAXYh-1629344919920)(C:\Users\admin\Desktop\华为认证培训\HCIA云计算\笔记思维导图\1628643890821.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5saKuK4U-1629344919920)(C:\Users\admin\Desktop\华为认证培训\HCIA云计算\笔记思维导图\1628643911912.png)]
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpd
spec:
replicas: 3
selector:
matchLabels:
app: httpd
template:
metadata:
labels:
app: httpd
spec:
containers:
- name: httpd
image: httpd
ports:
- containerPort: 80
apiVersion: v1
kind: Service
metadata:
name: httpd-svc
spec:
selector:
app: httpd
ports:
- protocol: TCP
port: 8080
targetPort: 80
kubectl get service
kubectl get endpoint
创建可供外部访问的Service
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MRKGobe6-1629344919921)(C:\Users\admin\Desktop\华为认证培训\HCIA云计算\笔记思维导图\1628644898346.png)]
apiVersion: v1
kind: Service
metadata:
name: httpd-svc
spec:
type: NodePort
selector:
app: httpd
ports:
- protocol: TCP
port: 8080
targetPort: 80
nodePort: 30144
kubectl get pod -n kube-system
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GRrZlBfT-1629344919921)(C:\Users\admin\Desktop\华为认证培训\HCIA云计算\笔记思维导图\1628647907600.png)]
apiVersion: v1
kind: Pod
metadata:
name: clientpod
spec:
containers:
- name: clientpod
image: busybox:1.28.3
args:
- /bin/sh
- -c
- sleep 30000
服务的DNS记录名称为:
<服务名称>..svc.cluster.local
服务后端的deployment中Pod的DNS记录名称为:
.<服务名称>..svc.cluster.local
ClientPod访问服务时,可以使用服务名称便捷抵达服务,甚至在与服务在同一时,直接用服务名称进行访问
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GKLChK94-1629344919921)(C:\Users\admin\Desktop\华为认证培训\HCIA云计算\笔记思维导图\1628650528149.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rw7Ue9Nc-1629344919922)(C:\Users\admin\Desktop\华为认证培训\HCIA云计算\笔记思维导图\1628650549158.png)]
apiVersion: v1
kind: Service
metadata:
name: headless-svc
spec:
selector:
app: httpd
ports:
- protocol: TCP
port: 80
targetPort: 80
clusterIP: None
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GtncBDbh-1629344919922)(C:\Users\admin\Desktop\华为认证培训\HCIA云计算\笔记思维导图\1628664184831.png)]
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-daemonset
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
##查看
kubectl get daemoset
kubectl get pod -o wide
##删除
kubectl delete daemoset nginx-daemoset
通过Deployment我们可以部署常驻型应用,它可以保证pod数量保证应用的实时可用,也可以通过灵活的扩缩容让业务处于最佳状态。
通过DaemonSet我们可以部署守护进程,它使得每个node上运行着一个固定pod
相对于Deployment和DaemonSet通常提供持续的服务,Job执行一次性任务
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
backoffLimit: 4
##查看
kubectl get job -w
##使用kubectl logs命令可以查看该Job运行结果。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OVKIJ3lg-1629344919923)(C:\Users\admin\Desktop\华为认证培训\HCIA云计算\笔记思维导图\1628666037583.png)]
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sFyKxFp7-1629344919923)(C:\Users\admin\Desktop\华为认证培训\HCIA云计算\笔记思维导图\1628666103047.png)]
kubectl get cronjob
kubctl delete cronjobs jobname
kubctl logs 输出结果
Kubernetes借助探针(Probes)机制,探针可以会周期性的监测容器运行的状态,返回结果。
Kubelet可以周期性的执行Container的诊断。为了执行诊断,kubelet调用Container实现的Handler,有三种Handler类型:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UPQ9otSq-1629344919923)(C:\Users\admin\Desktop\华为认证培训\HCIA云计算\笔记思维导图\1628729774566.png)]
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: liveness
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30;
rm -rf /tmp/healthy; sleep 600
image: busybox
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fGVhDGnj-1629344919924)(C:\Users\admin\Desktop\华为认证培训\HCIA云计算\笔记思维导图\1628730112663.png)]
在上一步骤中使用describe命令可以看到探针的一些策略。
Liveness: exec [cat /tmp/healthy] delay=5s timeout=1s period=5s #success=1 #failure=3
Delay=5s表示探针在容器启动后5秒开始进行第一次探测。
Timeout=1s表示容器必须在1秒内反馈信息给探针,否则视为失败。
Period=5s表示每5秒探针进行一次探测。
#success=1表示探测连续成功1次,表示成功。
#failure=3表示探测连续失败3次,视为Pod处于failure状态,重启容器。
apiVersion: v1
kind: Pod
metadata:
name: ubuntu
labels:
app: ubuntu
spec:
containers:
- name: ubuntu
image: ubuntu
args:
- /bin/sh
- -c
- apt-get update && apt-get -y install openbsd-inetd telnetd && /etc/init.d/openbsd-inetd start; sleep 30000
livenessProbe:
tcpSocket:
port: 23
initialDelaySeconds: 60
periodSeconds: 20
TCP探针检测能否建立连接。实验中部署一个telnet服务,探针探测23端口。
apiVersion: v1
kind: Pod
metadata:
name: ubuntu
labels:
app: ubuntu
spec:
containers:
- name: ubuntu
image: ubuntu
args:
- /bin/sh
- -c
- apt-get update && apt-get -y install openbsd-inetd telnetd && /etc/init.d/openbsd-inetd start; sleep 30000
livenessProbe:
tcpSocket:
port: 23
initialDelaySeconds: 60
periodSeconds: 20
Pod处于存活状态并不意味着可以提供服务,创建完成后通常需要进行诸如准备数据、安装和运行程序等步骤,才能对外提供服务。
Liveness探针指示是否处于存活状态,探针则可指示容器是否已经一切准备就绪,可以对外提供服务
就绪探针与存活探针一致,可以使用ExecAction,TCPSocketAction,HTTPGetAction三种方法。
就绪探针用于检测和显示Pod是否已经准备好对外提供业务。在实际使用场景中,就绪探针需要和业务绑定
就绪探针 | 存活探针 | |
---|---|---|
当Pod未通过检测 | 等待 | 杀死Pod,重启一个新Pod |
服务 | 如果检测失败,则从endpoint中移除pod | Endpoint自动更新新pod信息 |
作用 | Pod是否准备好提供服务 | Pod是否存活 |
#创建Pod
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpd-deployment
spec:
replicas: 3
selector:
matchLabels:
app: httpd
template:
metadata:
labels:
app: httpd
spec:
containers:
- name: httpd
image: httpd
ports:
- containerPort: 80
readinessProbe:
exec:
command:
- cat
- /usr/local/apache2/htdocs/index.html
initialDelaySeconds: 5
periodSeconds: 5
#创建Http的svc
apiVersion: v1
kind: Service
metadata:
name: httpd-svc
spec:
selector:
app: httpd
ports:
- protocol: TCP
port: 8080
targetPort: 80
删除配置文件后,节点移除集群,保留信息,配置文件恢复后,节点加入。
Kubernetes网络模型用于满足以下四类通信需求
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vl7aN4PB-1629344919924)(C:\Users\admin\Desktop\华为认证培训\HCIA云计算\笔记思维导图\1628755157572.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DlYszu5O-1629344919925)(C:\Users\admin\Desktop\华为认证培训\HCIA云计算\笔记思维导图\1628819167523.png)]
Pod的IP是集群可见的,即集群中的任何其他Pod和节点都可以通过IP直接与Pod 通信,这种通信不需要借助任何的网络地址转换、隧道或代理技术。Pod内部和外部使用的是同一个IP,这也意味着标准的命名服务和发现机制,比如DNS可以直接使用。
如下图中的Pod N和Pod M之间的通信。此网络也称为Pod网络。
运行Pod的各节点也会通过桥接设备等持有此平面网络中的一个IP地址,如下图中的cbr0接口,这就意味着Node到Pod间的通信也可在此网络上直接进行。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AcTeg3nz-1629344919925)(C:\Users\admin\Desktop\华为认证培训\HCIA云计算\笔记思维导图\1628819845778.png)]
编译安装NodePort
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WObXRlEy-1629344919925)(C:\Users\admin\Desktop\华为认证培训\HCIA云计算\笔记思维导图\1628823337455.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pcqt2hoC-1629344919926)(C:\Users\admin\Desktop\华为认证培训\HCIA云计算\笔记思维导图\1628823387440.png)]
Kubernetes设计了网络模型,但将其实现交给了网络插件。于是,各种解决方案不断涌现。
为了规范及兼容各种解决方案,CoreOS和Google联合制定了CNI( Container Network Interface)标准,旨在定义容器网络模型规范。它连接了两个组件:容器管理系统和网络插件。
CNI的设计思想是: 容器runtime在创建容器时,提前创建好网络的名称空间(netns),然后调用CNI插件为这个netns配置网络,而后再启动容器内的进程。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w8MKbbPM-1629344919926)(C:\Users\admin\Desktop\华为认证培训\HCIA云计算\笔记思维导图\1628839615004.png)]
/opt/cni/bin
各类CNI插件都至少要解决这两类问题:
针对第一个问题,flannel的解决方法是预留一个大网段,如10.244.0.0/16,而后自动为每个节点的Docker容器引擎分配一个子网,如10.244.1.0/24和10.244.2.0/24。子网和子网间能正常通信。
针对第二个问题,Flannel通过各种不同的后端(网络模型)来解决
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0PrT6C7Q-1629344919926)(C:\Users\admin\Desktop\华为认证培训\HCIA云计算\笔记思维导图\1628841879211.png)]
kubectl get cm kube-flannel-cfg -n kube-system -o yaml
#kubectl get cm kube-flannel-cfg -n kube-system -o yaml
apiVersion: v1
data:
cni-conf.json: |
{
"name": "cbr0",
"plugins": [
{
"type": "flannel",
"delegate": {
"hairpinMode": true,
"isDefaultGateway": true
}
},
"type": "portmap",
"capabilities": {
"portMappings": true
}
}
]
}
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
# flannel默认使用VXLAN作为后端
lVXLAN(Virtual extensible Local Area Network):虚拟可扩展局域网,是VLAN展方案,采用MAC in UDP的封装方式,属于NVo3( Network Virtualization overayer3)中的一种网络虚拟化技术。VXLAN广泛应用于云数据中心的软硬件SDN网络解决方案中。
具体实现方式为: 给普通数据报文添加到VXLAN报头后封装为外网可路由的UDP报文,然后以传统网络的通信方式传输该报文,待其到达目的主机后,去掉外网报头以及VXLAN报头,然后将报文转发给目的终端,整个过程中通信双方对物理网络无所感知。
上述过程相当于在传统的网络之上架起了由一条条VXLAN隧道构成的“高架”网络。
VXLAN技术的引入使得逻辑网络拓扑和物理网络拓扑实现了一定程度的解耦,网络拓扑的配置对于物理设备的配置的依赖程度有所降低,配置更灵活更方便。
传统的VXLAN后端使用隧道的通信方式会导致报文开销及流量增大。
于是flannel的VXLAN后端还支持DirectRouting模式,该模式通过添加路由信息的方式,直接使用节点的二层网络进行Pod的通信报文的交互,仅在跨网段时,才启用传统的隧道方式转发通信流量。
由于大部分场景中都省去了隧道首部开销,因此DirectRouting通信模式的性能基本接近于二层物理网络。
将 flannel项目官方提供的配置清单下载至本地:
卸载Flannel后将其 ConfigMap资源kube- flannel-cfg的data字段的网络配置部分修改为如下:
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan"
"Directrouting": true
}
}
使用“ kubectl apply”命令重新应用于集群中
# kubectl apply -f kube-flannel.yaml
查看节点路由表
10.244.2.0/24 via 192.168.56.68 dev ens33
10.244.3.0/24 via 192.168.56.69 dev ens33
注意:该配置推荐在集群网络初始化时做
host-gw后端通过添加路由信息使节点直接发送Pod的通信报文,其工作方式类似于VXLAN后端的direct routing的功能,但不包括其 VXLAN的隧道转发能力。
配置方式类似上述direct routing配置方式:
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": “host-gw"
}
}
当 Pod 指定到某个节点上时,首先创建的是一个 emptyDir 卷,并且只要 Pod 在该节点上运行,卷就一直存在。 就像它的名称表示的那样,卷最初是空的。 尽管 Pod 中的容器挂载 emptyDir 卷的路径可能相同也可能不同,但是这些容器都可以读写 emptyDir 卷中相同的文件。 当 Pod 因为某些原因被从节点上删除时,emptyDir 卷中的数据也会永久删除。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MejPV8yR-1629344919927)(C:\Users\admin\Desktop\华为认证培训\HCIA云计算\笔记思维导图\1629105684444.png)]
apiVersion: v1
kind: Pod
metadata:
name: em
spec:
containers:
- image: ubuntu
name: test-container
volumeMounts:
- mountPath: /cache
name: cache-volume
args:
- /bin/sh
- -c
- sleep 30000
volumes:
- name: cache-volume
emptyDir: {}
volumes:
- name: cache-volume
emptyDir:
sizeLimit:1Gi
hostPath配置项与emptyDir类似,但类型需指定:
apiVersion: v1
kind: Pod
metadata:
name: hppod
spec:
containers:
- image: ubuntu
name: hp-container
volumeMounts:
- mountPath: /hp-dir
name: hp-volume
args:
- /bin/sh
- -c
- sleep 30000
volumes:
- name: hp-volume
hostPath:
path: /root/runfile/hostpathdir
type: Directory
取值 | 行为 |
---|---|
空字符串(默认)用于向后兼容,这意味着在安装 hostPath 卷之前不会执行任何检查。 | |
DirectoryOrCreate | 如果在给定路径上什么都不存在,那么将根据需要创建空目录,权限设置为 0755,具有与 Kubelet 相同的组和所有权。 |
Directory | 在给定路径上必须存在的目录。 |
FileOrCreate | 如果在给定路径上什么都不存在,那么将在那里根据需要创建空文件,权限设置为 0644,具有与 Kubelet 相同的组和所有权。 |
File | 在给定路径上必须存在的文件。 |
Socket | 在给定路径上必须存在的 UNIX 套接字。 |
CharDevice | 在给定路径上必须存在的字符设备。 |
BlockDevice | 在给定路径上必须存在的块设备。 |
如果选择类型不正确,或主机上不存在对应资源(如不存在指定文件夹),kubernetes系统将无法继续创建Pod,创建步骤终止。Pod状态长时间处于ContainerCreating
PersistentVolume(pv)和PersistentVolumeClaim(pvc)是k8s提供的两种API资源,用于抽象存储细节。管理员关注于如何通过pv提供存储功能而无需关注用户如何使用,同样的用户只需要挂载pvc到容器中而不需要关注存储卷采用何种技术实现。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VA6cDUxw-1629344919927)(C:\Users\admin\Desktop\华为认证培训\HCIA云计算\笔记思维导图\1629107251401.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uew6ucKQ-1629344919928)(C:\Users\admin\Desktop\华为认证培训\HCIA云计算\笔记思维导图\1629107269623.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SOhEvneR-1629344919929)(C:\Users\admin\Desktop\华为认证培训\HCIA云计算\笔记思维导图\1629107842102.png)]
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc
spec:
accessModes:
- ReadWriteOnce
volumeName: mypv
resources:
requests:
storage: 1Gi
volumes:
- name: pvc-volume
persistentVolumeClaim:
claimName: mypvc
kubectl delete pvc mypvc && kubectl get pod
删除PVC的同时,会创建容器进行回收。删除PVC,PV不受影响(recycle)。
创建PV时指定storageClassName,可以在PVC中申请该PV。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gDbNEcjp-1629344919929)(C:\Users\admin\Desktop\华为认证培训\HCIA云计算\笔记思维导图\1629108861688.png)]
storageClass除了能够用上述用法之外,主要使用场景是动态供给PV。
由于kubernetes集群中存在大量的Pod,也就意味着很可能有大量的PV和PVC,如果需要一个一个手工创建无疑是一个巨大的工程,也不符合自动化的特点。
当开发人员开发完成一个应用程序,比如一个Web程序,在正式上线之前需要在各种环境中运行,例如开发时的开发环境,测试环节的测试环境,直到最终的线上环境。Web程序在各种不同的环境中都需要对接不同的数据库、中间件等服务,在传统方式中我们通过配置文件来定义这些配置,而kubernetes中如果需要进入一个个Pod来配置,那将会是一个巨大的麻烦。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IdzOZWNt-1629344919929)(C:\Users\admin\Desktop\华为认证培训\HCIA云计算\笔记思维导图\1629337598954.png)]
ConfigMap用于容器的配置文件管理。它作为多个properties文件的应用,类似一个专门存储配置文件的目录,里面存放着各种配置文件。
ConfigMap实现了image和应用程序的配置文件、命令行参数和环境变量等信息解耦。
ConfigMap和Secrets类似,但ConfigMap用于处理不含敏感信息的配置文件。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lQLY8Rs8-1629344919930)(C:\Users\admin\Desktop\华为认证培训\HCIA云计算\笔记思维导图\1629337623080.png)]
[root@k8s-master configmap]# cat game.properties
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30
[root@k8s-master configmap]# cat ui.properties
color.good=purple
color.bad=yellow
allow.textmode=true
how.nice.to.look=fairlyNice
# kubectl create configmap game-config --from-file=/runfile/configmap
configmap/game-config created
#kubectl get configmap
#kubectl describe cm game-config
从目录创建时指定了/runfile/configmap目录,创建时使用了目录下的所有文件。如果指定的不是目录而是单独文件,即从文件创建ConfigMap
#kubectl create configmap game-config --from-file=/runfile/configmap
--from-file参数可以多次使用,用于从多个文件创建ConfigMap的场景:
# kubectl create configmap game-config-3 --from-file=/runfile/configmap/game.properties --from-file=/runfile/configmap/ui.properties
configmap/game-config-3 created
之前的方式都需要新建配置文件,然后从文件创建ConfigMap。Kubernetes还提供使用实际配置值创建的方式,通过–from-literal参数实现。
#kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm
# kubectl describe configmaps special-config
Name: special-config
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
special.how:
----
very
special.type:
----
charm
Events: <none>
与deployment,pod等资源对象相同,ConfigMap也可以使用Yaml文件进行创建。
Data字段中,key1的定义方式类似使用–from-iterial,pro.property的定义方式类似使用–from-file.
apiVersion: v1
kind: ConfigMap
metadata:
name: specialconfig-2
data:
key1: value1
pro.property: |
key2: value2
key3: value3
可以直接将ConfigMap里的参数直接做为容器的环境变量供其中程序调用。
env可以创建环境变量的键,并且引用configmap里特定参数做为值。envFrom则自动将configmap的所有的键值对自动变成环境变量。
apiVersion: v1
kind: Pod
metadata:
name: cm-test-pod
spec:
containers:
- name: cm-container
image: busybox
args: ["/bin/sh", "-c", "env"]
env:
- name: special-env
valueFrom:
configMapKeyRef:
name: specialconfig-2
key: key1
envFrom:
- configMapRef:
name: specialconfig-2
restartPolicy: always
special-env=value1
key1=value1
pro.property=key2: value2
key3: value3
使用方式和存储章节中使用emptyDir和hostPath的volume类似,configMap挂载后变成了容器内的一个目录。
在容器的/etc/db目录中,我们可以看到两个文件,分别是key1,和pro.property,对应configmap中的两个DATA。键就是文件名,值就是文件内容。
apiVersion: v1
kind: Pod
metadata:
name: cmpod2
spec:
containers:
- name: cmpod2
image: busybox
args: [ "/bin/sh", "-c", "sleep 3000" ]
volumeMounts:
- name: db
mountPath: "/etc/db"
readOnly: true
volumes:
- name: db
configMap:
name: specialconfig-2
ConfigMap必须在创建Pod前创建完成。如果Pod调用ConfigMap失败,则无法创建。
Pod只能使用在同一Namespace中的ConfigMap
ConfigMap创建方式通常使用文件方式。
ConfigMap使用方式通常使用volume方式。
以volume方式挂载ConfigMap,如果更新ConfigMap或删除重建ConfigMap,Pod内挂载的配置信息会热更新。
#kubectl edit cm specialconfig-2
创建一个两个文件,写入用户名和密码。
[root@k8s-master secret]# echo -n "admin" > username.txt
[root@k8s-master secret]# echo -n "Huawei@123" > password.txt
使用kubectl命令创建。Secret的名称为db-user-pass
[root@k8s-master secret]# kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt
其中generic参数代表从本地的文件、目录或实际值(literal value)
为避免Yaml文件中的值被查看到,因此需要先用base64编码后,将值写入Yaml
[root@k8s-master secret]# echo -n "admin" | base64
YWRtaW4=
[root@k8s-master secret]# echo -n "Huawei@123" | base64
SHVhd2VpQDEyMw==
创建yaml文件
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: SHVhd2VpQDEyMw==
使用volume方式挂载Secret给Pod和使用ConfigMap类似。
一个Secret在容器内体现为一个目录,一对键值对是一个文件,其中键是文件名称,值是文件内容。
Secret内容在挂载给时进行解码,因此在内部是明文呈现.
apiVersion: v1
kind: Pod
metadata:
name: spod
spec:
containers:
- image: busybox
name: spod
args: ["/bin/sh","-c","sleep 3000"]
volumeMounts:
- name: secrets
mountPath: "/etc/secret"
readOnly: true
volumes:
- name: secrets
secret:
secretName: mysecret
apiVersion: v1
kind: Pod
metadata:
name: spod2
spec:
containers:
- image: busybox
name: spod2
args: ["/bin/sh","-c","sleep 3000"]
volumeMounts:
- name: secrets
mountPath: "/etc/secret"
readOnly: true
volumes:
- name: secrets
secret:
secretName: mysecret
items:
- key: password
path: my-group/my-passwd
141 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
142 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
143 yum makecache
144 cd /etc/yum.repos.d
145 ls
146 mv Media.repo Media.repo.bak
147 ls
148 yum cleanall
149 yum clean all
150 yum make cache
151 yum makecache
152 ping baidu.com
153 yum install yum-utils device-mapper-presistent-data lvm2 -y
154 yum list
155 rpm -qa | grep yum
156 yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo
157 yum -y install docker-ce-18.06.2
158 ls
159 cat docker-ce.repo
160 yum makecache
161 yum -y install docker-ce-18.06.2
162 yum clean all
163 yum makecache
164 yum install docker-ce-18.06.2.ce -y
165 systemctl start docker
166 systemctl enable docker
167 systemctl status docker
168 docker version
169 docker info
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://m30jn00e.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
175 docker info
176 yum install bash-completion -y
177 source /usr/share/bash-completion/bash_completion
178 labs.play-with-docker
K8SMaster 192.168.31.113 192.168.81.4
K8Snode1 192.168.31.114 192.168.81.5
K8Snode2 192.168.31.115 192.168.81.6
(1)修改主机名:
hostnamectl set-hostname k8s-master
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2
(2)修改/etc/hosts
cat <> /etc/hosts
192.168.81.4 k8s-master
192.168.81.5 k8s-node1
192.168.81.6 k8s-node2
EOF
(3)关闭主机防火墙:
systemctl stop firewalld
systemctl disable firewalld
(4)关闭swap分区
sed -i 's/.*swap.*/#$/' /etc/fstab
swapoff -a
(5)加载bf_netfilter
modprobe br_netfilter
(6)配置内核参数
cat <<EOF>> /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
(7)加载配置
sysctl -p /etc/sysctl.d/k8s.conf
(8)检测生成文件
ls /proc/sys/net/bridge/
##显示以下文件
bridge-nf-call-ip6tables bridge-nf-call-ip6tables
(9)添加k8s国内yum源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://repo.huaweicloud.com/kubernetes/yum/repos/kubernetes-el7-aarch64/
enabled=1
gpgcheck=1
repo_gpgcheck=0
gpgkey=https://repo.huaweicloud.com/kubernetes/yum/doc/yum-key.gpg https://repo.huaweicloud.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum makecache
(10)安装依赖包和工具
yum -y install epel-release
yum -y install yum-utils device-mapper-persistent-data lvm2 net-tools conntrack-tools wget vim ntpdate libseccomp libtool-ltdl tree
(11)配置时间同步
systemctl enable ntpdate.service
systemctl enable ntpdate.service
echo '*/30 * * * * /usr/sbin/ntpdate time7.aliyun.com > /dev/null 2>&1' > /tmp/crontab2.tmp
crontab /tmp/crontab2.tmp
systemctl start ntpdate.service
(12)安装docker CE
yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo
yum clean all
yum makecache
yum install docker-ce-18.06.2.ce -y
(13)使用国内的docker镜像源
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://m30jn00e.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
(14)启动docker
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
systemctl status docker
(15)下载配置文件
(16)编辑拉取K8s镜像脚本
在所有节点安装软件:
yum install nfs-utils rpcbind -y
###在server节点上进行配置
[root@k8s-master ~]# mkdir /nfs
[root@k8s-master ~]# chmod 755 /nfs
[root@k8s-master ~]# vim /etc/exports
/nfs * (rw,syns)
[root@k8s-master ~]# systemctl start nfs
[root@k8s-master ~]# systemctl enable nfs
[root@k8s-master ~]# systemctl start rpcbind
[root@k8s-master ~]# systemctl enable rpcbind
[root@k8s-master nfs]# showmount -e localhost
Export list for localhost:
/nfs *
###在客户端安装完成后,启动服务和检测
[root@k8s-node2 ~]# systemctl start nfs
[root@k8s-node2 ~]# systemctl enable nfs
[root@k8s-node2 ~]# systemctl enable rpcbind
[root@k8s-node2 ~]# systemctl start rpcbind
[root@k8s-node1 ~]# showmount -e k8s-master
Export list for k8s-master:
/nfs *
(1)在所有的节点进行安装
gkey=https://repo.huaweicloud.com/kubernetes/yum/doc/yum-key.gpg https://repo.huaweicloud.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum makecache
(10)安装依赖包和工具
~~~bash
yum -y install epel-release
yum -y install yum-utils device-mapper-persistent-data lvm2 net-tools conntrack-tools wget vim ntpdate libseccomp libtool-ltdl tree
(11)配置时间同步
systemctl enable ntpdate.service
systemctl enable ntpdate.service
echo '*/30 * * * * /usr/sbin/ntpdate time7.aliyun.com > /dev/null 2>&1' > /tmp/crontab2.tmp
crontab /tmp/crontab2.tmp
systemctl start ntpdate.service
(12)安装docker CE
yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo
yum clean all
yum makecache
yum install docker-ce-18.06.2.ce -y
(13)使用国内的docker镜像源
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://m30jn00e.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
(14)启动docker
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
systemctl status docker
(15)下载配置文件
(16)编辑拉取K8s镜像脚本
在所有节点安装软件:
yum install nfs-utils rpcbind -y
###在server节点上进行配置
[root@k8s-master ~]# mkdir /nfs
[root@k8s-master ~]# chmod 755 /nfs
[root@k8s-master ~]# vim /etc/exports
/nfs * (rw,syns)
[root@k8s-master ~]# systemctl start nfs
[root@k8s-master ~]# systemctl enable nfs
[root@k8s-master ~]# systemctl start rpcbind
[root@k8s-master ~]# systemctl enable rpcbind
[root@k8s-master nfs]# showmount -e localhost
Export list for localhost:
/nfs *
###在客户端安装完成后,启动服务和检测
[root@k8s-node2 ~]# systemctl start nfs
[root@k8s-node2 ~]# systemctl enable nfs
[root@k8s-node2 ~]# systemctl enable rpcbind
[root@k8s-node2 ~]# systemctl start rpcbind
[root@k8s-node1 ~]# showmount -e k8s-master
Export list for k8s-master:
/nfs *
(1)在所有的节点进行安装