kubectl的命令可分为三类
1.陈述式命令(命令式对象管理) 类似于我们直接在docker 中 docker run 命令
2.陈述式对象配置(命令式对象配置) 类似于类似于 docker-compose.yml
3.声明式对象配置(声明式对象配置)
kubectl是k8s集群的命令行工具,通过它能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署,kubectl命令的语法如下:
kubectl [command] [type] [name] [flags]
comand:指定要对资源执行的操作,例如create、 get、delete
type:指定资源类型,比如deployment、pod、 service
name:指定资源的名称,名称大小写敏感
flags:指定额外的可选参数
kubectl get nodes
kubectl 常用命令
1.kubectl get nodes —查询k8s集群节点
2.kubectl get pod —查看所有的pod
3.kubectl describe pod nginx-6867cdf567-94kcb —查看pod详细内容
4.kubectl cluster-info —查看k8s 集群的信息
5.kubectl version 查看当前k8s 集群的版本
通过陈述式命令(命令式对象管理) 对namespace/pod操作
pod 是我们k8s 最小单元 容器运行在我们的pod里面
一个pod可以在里面运行n多个不同容器
1.命令形式创建一个namespace
kubectl create namespace mayikt-sit
2.查询所有的namespace
kubectl get ns
3.在mayikt-sit的namespace 下运行一个pod
kubectl run pod --image=nginx -n mayikt-sit
4.查看mayikt-sit下的pod,注意事项 查询pod 需要指定具体命名空间
kubectl get pods -n mayikt-sit
kubectl get pods —默认查询 default namespace
5.查看该pod的详细信息
kubectl describe pod pod-864f9875b9-h467q (错误方式)
需要指定该pod对应的namespace 如果没有指定则会报错
kubectl describe pod pod-864f9875b9-h467q -n mayikt-sit (正确方式)
6.删除该pod
kubectl delete pods pod-864f9875b9-whqt6 -n mayikt-sit
但是删除该pod之后,又重新启动一个新的pod
kubectl get pods -n mayikt-sit
对比发现pod name 名称已经发生变化,然后查看该新的pod详细信息
kubectl describe pod pod-864f9875b9-jdp7k -n mayikt-sit
你会发现ip 也发生了变化。
我们应该通过删除命名空间,则自动会将这些pod删除
kubectl delete ns mayikt-sit
命令式对象配置就是使用命令配合配置文件一起来操作k8s资源,类似于我们学习的
docker-compose 定义 yml 配置文件 需要对yaml 配置有一定了解。
kubectl create -f mayikt-pod1.yml 创建资源
kubectl delete -f mayikt-pod1.yml 删除资源
kubectl get-f mayikt-pod1.yml
1.创建 mayikt-pod1.yml
apiVersion: v1
kind: Namespace
metadata:
name: mayikt-sit #指定的Namespace空间名称
---
apiVersion: v1
kind: Pod
metadata:
name: mayikt-nginx-pod #指定pod的名称
namespace: mayikt-sit #指定该pod对应的Namespace
spec:
containers:
- name: mayikt-nginx-container #运行一个nginx容器
image: nginx:1.17.9 #指定镜像的名称
上传到服务器端
/usr/local 创建一个 mayikt 来演示我们的
mkdir mayikt
执行kubectl create -f mayikt-pod1.yml
创建成功 自动创建Namespace mayikt-sit 和 pod mayikt-nginx-pod
执行 kubectl get ns
执行 kubectl get pods -n mayikt-sit
查看该pod详细信息 kubectl describe pod mayikt-nginx-pod -n mayikt-sit
该容器运行在 164节点 执行curl 172.17.0.2 说明 pod中容器运行成功
执行get命令,查看资源 kubectl get -f mayikt-pod1.yml
删除delete 命令 kubectl delete -f mayikt-pod1.yml
namespace “mayikt-sit” deleted
pod “mayikt-nginx-pod” deleted
执行 kubectl get ns
再访问该nginx 已经访问不了
声明式对象配置跟命令式对象配置很类似,通过命令apply
kubectl apply -f mayikt-pod2.yml
在创建一个mayikt-pod2.yml
apiVersion: v1
kind: Namespace
metadata:
name: mayikt-sit #指定的Namespace空间名称
---
apiVersion: v1
kind: Pod
metadata:
name: mayikt-nginx-pod #指定pod的名称
namespace: mayikt-sit #指定该pod对应的Namespace
spec:
containers:
- name: mayikt-nginx-container #运行一个nginx容器
image: nginx:1.17.9 #指定镜像的名称
执行:kubectl apply -f mayikt-pod2.yml
查看:pod kubectl get pods -n mayikt-sit
查看pod 详细信息:kubectl describe pod mayikt-nginx-pod -n mayikt-sit
再次执行 kubectl apply -f mayikt-pod2.yml 资源没有发生任何变化
namespace/mayikt-sit unchanged
pod/mayikt-nginx-pod unchanged
未发生变化
修改nginx的版本1.17.8
再次执行:kubectl apply -f mayikt-pod2.yml
pod 是有发生变化的
查看pod 详细信息
kubectl describe pod mayikt-nginx-pod -n mayikt-sit
nginx:1.17.9 改成nginx:1.17.8
总结:
如果资源不存在就创建(create),相当于kubectl create
如果资源已存在,就更新(update),相当于kubectl patch
1.谈谈大家构建k8s集群环境过程常见问题
2.简单谈谈K8S集群架构设计原理
3.谈谈pod 、Namespace、Label、Deployment、Service之间关系
4.pod控制器原理、类型有哪些
5.pod的生命周期
6.实战K8S构建nginx集群环境 弹性扩容与缩容
1.Kubernetes 支持多个虚拟集群,它们底层依赖于同一个物理集群。 这些虚拟集群被称为命名空间。可以实现多套环境的资源隔离或者多租户的资源隔离。
2.资源的名称需要在命名空间内是唯一的,但不能跨命名空间。命名空间不能相互嵌套,每个 Kubernetes 资源只能在一个命名空间中。命名空间是在多个用户之间划分集群资源的一种方法
3.k8s集群中的所有的Pod都是可以相互访问的,将两个Pod划分到不同的namespace下。kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的"组",以方便不同的组的资源进行隔离使用和管理,不同的Namespace下的pod 相互之间是访问不通的。
执行命令 kubectl get ns 查看所有的 Namespace
1.default 没有指明使用其它命名空间的对象所使用的默认命名空间
2.kube-system Kubernetes 系统创建对象所使用的命名空间
3.kube-public 这个命名空间是自动创建的,所有用户(包括未经过身份验证的用户)都可以读取它。这个命名空间主要用于集群使用,以防某些资源在整个集群中应该是可见和可读的。这个命名空间的公共方面只是一种约定,而不是要求。
创建Namespace
kubectl create ns mayikt-sit
删除Namespace
kubectl delete ns mayikt-sit
Pod是在k8s集群进行管理的最小单元,程序要运行必须部署在容器(docker)中,而容器必须存在于Pod中。
Pod是对(docker)容器的封装,1个Pod中可以存在一个或者多个容器。
1.kubectl create ns mayikt-sit
2.运行一个 nginx pod
kubectl run nginx --image=nginx:1.17.9 --port=80 --namespace=mayikt-sit
3.kubectl get pod -n mayikt-sit 查看命名空间mayikt-sit下的pod
4.查看pod的ip:kubectl get pod -n mayikt-sit -o wide
5.更多pod详细信息:kubectl describe pod nginx-64777cd554-z6hgr -n mayikt-sit
6.删除pod
直接删除pod是删除不成功的 ,pod控制器有会重新启动一个pod
kubectl get pods -n mayikt-sit
kubectl delete pod nginx-64777cd554-z6hgr -n mayikt-sit
继续执行 kubectl get pods -n mayikt-sit
我们将pod控制器删除 这样我们pod就可以删除啦
kubectl get deployment -n mayikt-sit 查询mayikt-sit下的控制器
删除pod控制器
kubectl delete deployment nginx -n mayikt-sit
kubectl get deployment -n mayikt-sit
kubectl get pods -n mayikt-sit
这样的我们的pod就被删除啦
1.Label其实就一对 key/value ,被关联到对象上,比如Pod,标签的使用我们倾向于能够标示对象的特殊特点,Labels的值对系统本身并没有什么含义,只是对用户才有意义。同一个资源对象的labels属性的key必须唯一,label可以附加到各种资源对象上,如Node,Pod,Service,RC等。一个资源拥有多个标签,可以实现不同维度的管理。标签(Label)的组成: key=value。Label可以在创建对象时就附加到对象上,也可以在对象创建后通过API进行额外添加或修改
2.label 必须以字母或数字开头,可以使用字母、数字、连字符、点和下划线,最长63个字符。
3.当相同类型的资源越来越多,对资源划分管理是很有必要,此时就可以使用Label为资源对象 命名,以便于配置,部署等管理工作,提升资源的管理效率。label 作用类似Java包能对不同文件分开管理,让整体更加有条理,有利于维护。
4.通过Label来对对象进行引用。
例如:
1.版本标签:“version”:"“v1”, “version”:“v2”(灰度发布)
2.环境标签:“environment”:“sit”,“environment”:“pre”,“environment”:“prd”
创建一个mayikt-pod3.yml
apiVersion: v1
kind: Namespace
metadata:
name: mayikt-sit #指定的Namespace空间名称
---
apiVersion: v1
kind: Pod
metadata:
name: mayikt-nginx-pod #指定pod的名称
namespace: mayikt-sit #指定该pod对应的Namespace
spec:
containers:
- name: mayikt-nginx-container #运行一个nginx容器
image: nginx:1.17.9 #指定镜像的名称
执行命令:kubectl create -f mayikt-pod3.yml
查看标签 kubectl get pod -n mayikt-sit --show-labels
为我们的pod打标签
kubectl label pod mayikt-nginx-pod -n mayikt-sit version=1.0
执行命令:查看标签 kubectl get pod -n mayikt-sit --show-labels
更新标签
kubectl label pod mayikt-nginx-pod -n mayikt-sit version=2.0 --overwrite
查看标签 kubectl get pod -n mayikt-sit --show-labels
再启动一个新的pod,创建一个文件mayikt-pod4.yml
apiVersion: v1
kind: Namespace
metadata:
name: mayikt-sit #指定的Namespace空间名称
---
apiVersion: v1
kind: Pod
metadata:
name: mayikt-nginx-pod2 #指定pod的名称
namespace: mayikt-sit #指定该pod对应的Namespace
spec:
containers:
- name: mayikt-nginx-container #运行一个nginx容器
image: nginx:1.17.9 #指定镜像的名称
执行: kubectl create -f mayikt-pod4.yml
Error from server (AlreadyExists): error when creating “mayikt-pod4.yml”: namespaces “mayikt-sit” already exists
该错误可以忽略 因为该namespaces 已经存在。
执行kubectl get pod -n mayikt-sit -o wide
查看标签kubectl get pod -n mayikt-sit --show-labels
修改标签 kubectl label pod mayikt-nginx-pod2 -n mayikt-sit version=3.0 --overwrite
查看标签 kubectl get pod -n mayikt-sit --show-labels
配置文件的形式指定:
apiVersion: v1
kind: Namespace
metadata:
name: mayikt-pre #指定的Namespace空间名称
---
apiVersion: v1
kind: Pod
metadata:
name: mayikt-pre #指定pod的名称
namespace: mayikt-pre #指定该pod对应的Namespace
labels:
version: "8.0" #指定labels标签
env: "sit"
spec:
containers:
- name: mayikt-nginx-container #运行一个nginx容器
image: nginx:1.17.9 #指定镜像的名称
执行命令:kubectl create -f mayikt-pod5.yml
查看标签: kubectl get pod -n mayikt-pre --show-labels
搜索标签
kubectl get pods -l “version=2.0” -n mayikt-sit --show-labels
Deployment为Pod和Replica Set提供声明式更新。
你只需要在 Deployment 中描述您想要的目标状态是什么,Deployment controller 就会帮您将 Pod 和ReplicaSet 的实际状态改变到您的目标状态。您可以定义一个全新的 Deployment 来创建 ReplicaSet 或者删除已有的 Deployment 并创建一个新的来替换。
注意:您不该手动管理而是由 Deployment 创建的 Replica Set,否则您就篡越了 Deployment controller 的职责!下文罗列了 Deployment 对象中已经覆盖了所有的用例。如果未有覆盖您所有需要的用例,请直接在 Kubernetes 的代码库中提 issue。
在k8s中,Pod是 最小的控制单元,我们的k8s不会直接控制Pod,而是通过Pod控制器来完成的。Pod控制器用于pod的管理,确保pod资源符合预期的状态,当pod的资源出现故障时,会尝试进行重启或重建pod。
清空之前的环境 删除之前的 命名空间
kubectl delete ns mayikt-sit
执行命令 创建命名空间 kubectl create ns mayikt-sit
创建nginx 集群 3个副本
--image 指定pod的镜像
--port 指定端口
--replicas 指定创建pod数量
--namespace 指定namespace
kubectl run nginx --image=nginx:1.17.9 --port=80 --replicas=3 --namespace=mayikt-sit
查看 pod的 ip 信息 kubectl get pod -n mayikt-sit -o wide
kubectl describe deployment nginx -n mayikt-sit
如删除一个pod
kubectl delete pod nginx-5c9b49c46-df5tc -n mayikt-sit
kubectl get pod -n mayikt-sit -o wide
删除之后 通过控制器自动有创建的一个pod
kubectl describe pod nginx-5c9b49c46-zqv6g -n mayikt-sit
172.17.0.1 冲突原因是因为 在不同节点部署容器 只是容器ip冲突 但是它们分别部署在
164和165节点
kubectl describe pod nginx-5c9b49c46-n52dl -n mayikt-sit
service是k8s中的一个重要概念,主要是提供负载均衡和服务自动发现
因为Pod IP会随着Pod的重建产生变化,可以使用Service提供的ip
来访问到我们的pod。
1.查看当前nginx的deployment
kubectl describe deployment nginx -n mayikt-sit
2.创建service
kubectl expose deploy nginx --name=mayikt-service01 --type=ClusterIP --target-port=80 -n mayikt-sit
3.查看命名空间下的service
kubectl get service -n mayikt-sit
4.查看命名空间下的service详细内容
kubectl get service -n mayikt-sit -o wide
我们可以通过 CLUSTER-IP(集群的IP),这就是service的IP,在Service的生命周期中,地址是不会变动的。
5.然后在工作节点上执行
curl 10.99.114.200
6.以上方式无法外部,我们可以外部访问方式
只需要将–type 修改为NodePort
kubectl expose deploy nginx --name=mayikt-service02 --type=NodePort --target-port=80 -n mayikt-sit
7.在执行查看 该service
kubectl get pods,service -n mayikt-sit
9.删除service
service svc
kubectl delete svc mayikt-service01 -n mayikt-sit
kubectl delete svc mayikt-service02 -n mayikt-sit
10.kubectl get svc -n mayikt-sit 查看service
10.但是这种方式很麻烦我们可以直接定义成配置文件
创建一个 mayikt-serivce01.yml
apiVersion: v1
kind: Service
metadata :
name: mayikt-service01 ## Service名称
namespace: mayikt-sit ## 命名空间 mayikt -sit
spec:
clusterIP: 10.99.114.201
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
run: nginx
type: ClusterIP
11.执行 kubectl create -f mayikt-service-1.yml
12.执行 kubectl get pods,service -n mayikt-sit
13.工作节点上执行 curl 192.168.75.170
创建: kubectl create -f mayikt-service-1.yml
删除: kubectl delete -f mayikt-service-1.yml
筛选标签: kubectl get pods -l “version=2.0” -n mayikt-sit --show-labels
k8s中最小调度单元 ,一个pod里面可以有n多个不同的容器
1.Pod实际上是容器的集合,是k8s中最小调度单元
2.一个pod里面可以有n多个不同的容器
3.一个pod内的容器之间共享相同的pod ip网络
4.Pause容器,这是每个Pod都会有的一个根容器
5.可以在根容器上设置ip地址,其它容器都共享相同Ip (Pod IP),以实现Pod内部的网路通信
,Pod内部的通讯,Pod的之间的通讯采用虚拟二层网络技术来实现。
apiVersion: v1 #必填,版本号,例如v1
kind: Pod #必填,资源类型,例如Pod、service、Deployment
metadata: #必填,元数据
name: mayikt-pod #必填,Pod名称
namespace: mayikt-namespace01 #Pod所属的命名空间, 默认为”default"
labels: #自定义标签列表
- name: v1
spec: #必填,Pod中容器的详细定义
containers: #必填 , Pod中容器列表
- name: mayikt-container01 #必填,容器名称
image: nginx:1.7.9 #必填, 容器的镜像名称
imagePullPolicy: [ Always Never |IfNotPresent] #获取镜像的策略
command: [string] #容器的启动命令 列表,如不指定,使用打包时使用的启动命令
args: [string] #容器的启动命令参数列表
workingDir: string #容器的工作目录
volumeMounts: #挂载到容器内部的存储卷配置
- name: string #引用pod定义的共享存储卷的名称,需用volumes[ ]部分定义的的卷名
mountPath: string #存储卷在容器内mount的绝对路径,应少于512字符
read0nly: boolean #是否为只读模式
ports: #需要暴露的端口库号列表
- name: string #端口的名称
containerPort: int #容器需要 监听的端口号
hostPort: int #容器所在主机需要监听的端口号,默认与Container相同
protocol: string #控端口协议,支持TCP和UDP,默认TCP
env: #容器运行前需设置的环境变量列表
- name: string #环境变量名称
value: string #环境变量的值
resources: #资源限制和请求的设置
limits: #资源限制的设置
cpu: string #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
memory: string #内存限制, 单位可以为Mib/Gib,将用于docker run --memory参数
requests: #资源请求的设置
cpu: string #Cpu请求,容器启动的初始可用数量
memory: string #内存请求,容器启动时的初始可用数量
lifecycle: #生命周期钩子
postStart: #容器启动后立即执行此钩子,如果执行失败,会根据重启策略进行重启
preStop: #容器终止前执行此钩子,无论结果如何,容器都会终止
livenessProbe: #树对Pod内各容器健康检查的设置, 当探测无响应几次后将自动重启该容器
exec: #对Pod容器内检查方式设置为exec方式
command: [string] #exec方式需要 制定的命令或脚本
httpGet: #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
path: string
port: number
host: string
scheme: string
HttpHeaders:
- name: string
value: string
tcpSocket: #对Pod内个容器 健康检查方式设置为tcpSocket方式
port: number
上面配置内容示例
apiVersion: v1 # 必选,API的版本号
kind: Pod # 必选,类型Pod
metadata: # 必选,元数据即基础信息
name: nginx # 必选,符合RFC 1035规范的Pod名称
namespace: web-testing # 可选,不指定默认为default,Pod所在的命名空间
labels: # 可选,标签选择器,一般用于Selector
- app: nginx
annotations: # 可选,注释列表
- app: nginx
spec: # 必选,用于定义容器的详细信息
containers: # 必选,容器列表
name: nginx # 必选,符合RFC 1035规范的容器名称
image: nginx:v1 # 必选,容器所用的镜像的地址
imagePullPolicy: Always # 可选,镜像拉取策略
镜像拉取策略分三种:
Always不管镜像存不存在本地都拉取(默认)
Nerver 不管镜像存不存在本地都不拉取
IfNotpresent 本地有镜像不拉取,没有就拉取
workingDir: /usr/share/nginx/html # 可选,容器的工作目录
volumeMounts: # 可选,存储卷配置
name: webroot # 存储卷名称
mountPath: /usr/share/nginx/html # 挂载目录
readOnly: true # 只读
ports: # 可选,容器需要暴露的端口号列表
name: http # 端口名称
containerPort: 80 # 端口号
protocol: TCP # 端口协议,默认TCP
env: # 可选,环境变量配置
name: TZ # 变量名
value: Asia/Shanghai
name: LANG
value: en_US.utf8
resources: # 可选,资源限制和资源请求限制
limits: # 最大限制设置
cpu: 1000m
memory: 1024MiB
requests: # 启动所需的资源
cpu: 100m
memory: 512MiB
readinessProbe: # 可选,容器状态检查
httpGet: # 检测方式
path: / # 检查路径
port: 80 # 监控端口
timeoutSeconds: 2 # 超时时间
initialDelaySeconds: 60 # 初始化时间
livenessProbe: # 可选,监控状态检查
exec: # 检测方式
command:
- cat
- /health
httpGet: # 检测方式
path: /_health
port: 8080
httpHeaders:
- name: end-user
value: jason
tcpSocket: # 检测方式
port: 80
initialDelaySeconds: 60 # 初始化时间
timeoutSeconds: 2 # 超时时间
periodSeconds: 5 # 检测间隔
successThreshold: 2 # 检查成功为2次表示就绪
failureThreshold: 1 # 检测失败1次表示未就绪
securityContext: # 可选,限制容器不可信的行为
provoleged: false
restartPolicy: Always # 可选,默认为Always
nodeSelector: # 可选,指定Node节点
region: subnet7
imagePullSecrets: # 可选,拉取镜像使用的secret
name: default-dockercfg-86258
hostNetwork: false # 可选,是否为主机模式,如是,会占用主机端口
volumes: # 共享存储卷列表
name: webroot # 名称,与上述对应
emptyDir: {} # 共享卷类型,空
hostPath: # 共享卷类型,本机目录
path: /etc/hosts
secret: # 共享卷类型,secret模式,一般用于密码
secretName: default-token-tf2jp # 名称
defaultMode: 420 # 权限
configMap: # 一般用于配置文件
name: nginx-conf
defaultMode: 420
查看一级属性
kubectl explain pod — 查看一级属性
kubectl explain pod.metadata ----查看二级属性
kubectl explain pod.metadata.namespace----查看三级属性
在k8s中 一级属性 主要包含5个核心部分
1.apiVersion 版本,#必填,版本号,例如v1 由k8s内部定义, 版本号是通过kubectl api-versions 查询
2.kind 类型,必填,资源类型,例如Pod、service、Deployment等,通过kubectl api-resources查询
3.metadata <0bject> 元数据,主要是资源标识和说明,常用的有name、namespace、 labels等
4.spec 描述 对各种资源配置的详细描述
5.status 状态信息,需要我们定义 由k8s自动生成的
例如:
1.创建一个命名空间
kubectl create ns mayikt-sit
2.创建一个pod
kubectl run nginx --image=nginx:1.17.9 --port=80 --namespace=mayikt-sit
kubectl get pods -n mayikt-sit
kubectl get pods -n mayikt-sit nginx-5c9b49c46-7nqfq -o yaml 以yml格式展示
spec详细配置:
1.containers <[]0bject> 容器列表, 一个pod中可以有n多个不同的容器 用于定义容器的详细信息
2.nodeName 指定该pod运行到具体的node节点,根据nodeName的值将pod调度到指定的Node节点上
例如:node1 :192.168.110.1 node2 :192.168.110.2
3.nodeSelector
apiVersion: v1
kind: Pod # 类型为pod
metadata:
name: mayikt-pod01
namespace: mayikt-sit
labels:
user: v1 ## 标签值
spec:
containers:
- name: nginx ##容器1
image: nginx:1.17.9
- name: mayikt-tomcat ##容器2
image: tomcat:8
1.kubectl delete ns mayikt-sit
2.kubectl create ns mayikt-sit
3.kubectl create -f mayikt-pod-info02.yml
4.
kubectl describe pods -n mayikt-sit
kubectl get pods -n mayikt-sit
apiVersion: v1
kind: Pod # 类型为pod
metadata:
name: mayikt-pod01
namespace: mayikt-sit
labels:
user: v1 ## 标签值
spec:
containers:
- name: nginx1 ##容器1
image: nginx:1.17.9
- name: nginx2 ##容器2
image: nginx:1.17.9
1.kubectl delete ns mayikt-sit
2.kubectl create ns mayikt-sit
3.kubectl create -f mayikt-pod-info02.yml
kubectl describe pods -n mayikt-sit
kubectl get pods -n mayikt-sit
pod内的容器共享相同的ip和端口空间 启动两个nginx 则端口冲突 第二个nginx 会不断重试
重试次数5次。
apiVersion: v1
kind: Pod # 类型为pod
metadata:
name: mayikt-pod01
namespace: mayikt-sit
labels:
user: v1 ## 标签值
spec:
containers:
- name: nginx1 ##容器1
image: nginx:1.17.9
imagePullPolicy: IfNotPresent #用于设置镜像拉取策略
- name: nginx2 ##容器1
image: nginx:1.17.9
1.Always: 每次都是从远程仓库拉取镜像
2.IfNotPresent: 如果本地有该镜像则使用本地,如果本地没有该镜像则使用远程
3.Never: 只使用本地镜像,不去远程仓库拉取,本地没有该镜像则会报错
只使用本地镜像,不去远程仓库拉取,本地没有该镜像则会报错
1.在node(工作节点)上执行 docker images
2.将工作节点上的nginx镜像删除
kubectl delete ns mayikt-sit 我们需要先删除 mayikt-sit命名空间 则会停止nginx容器
3.在工作节点上执行
docker rmi nginx:1.17.9
docker rmi nginx:latest
Never: 只使用本地镜像,不去远程仓库拉取,本地没有该镜像则会报错
apiVersion: v1
kind: Pod # 类型为pod
metadata:
name: mayikt-pod01
namespace: mayikt-sit
labels:
user: v1 ## 标签值
spec:
containers:
- name: nginx1 ##容器1
image: nginx:1.17.9
imagePullPolicy: Never #用于设置镜像拉取策略
kubectl create ns mayikt-sit
kubectl create -f mayikt-pod-info02.yml
kubectl describe pods -n mayikt-sit
kubectl get pods -n mayikt-sit
如果本地有该镜像则使用本地,如果本地没有该镜像则使用远程
1.在node(工作节点)上执行 docker images
2.将工作节点上的nginx镜像删除
kubectl delete ns mayikt-sit 我们需要先删除 mayikt-sit命名空间 则会停止nginx容器
3.在工作节点上执行
docker rmi nginx:1.17.9
docker rmi nginx:latest
apiVersion: v1
kind: Pod # 类型为pod
metadata:
name: mayikt-pod01
namespace: mayikt-sit
labels:
user: v1 ## 标签值
spec:
containers:
- name: nginx1 ##容器1
image: nginx:1.17.9
imagePullPolicy: IfNotPresent #用于设置镜像拉取策略
kubectl create ns mayikt-sit
kubectl create -f mayikt-pod-info03.yml
kubectl describe pods -n mayikt-sit
kubectl get pods -n mayikt-sit
第一次 从远处下载镜像
删除该命名空间 从新创建pod
kubectl delete ns mayikt-sit
kubectl create ns mayikt-sit
kubectl create -f mayikt-pod-info03.yml
kubectl describe pods -n mayikt-sit
kubectl get pods -n mayikt-sit
第二次就没有从远处下载镜像
每次都是从远程仓库拉取镜像
1.在node(工作节点)上执行 docker images
2.将工作节点上的nginx镜像删除
kubectl delete ns mayikt-sit 我们需要先删除 mayikt-sit命名空间 则会停止nginx容器
3.在工作节点上执行
docker rmi nginx:1.17.9
docker rmi nginx:latest
apiVersion: v1
kind: Pod # 类型为pod
metadata:
name: mayikt-pod01
namespace: mayikt-sit
labels:
user: v1 ## 标签值
spec:
containers:
- name: nginx1 ##容器1
image: nginx:1.17.9
imagePullPolicy: Always #用于设置镜像拉取策略
- name: nginx2 ##容器1
image: nginx:1.17.9
kubectl create ns mayikt-sit
kubectl create -f mayikt-pod-info03.yml
kubectl describe pods -n mayikt-sit
kubectl get pods -n mayikt-sit
第一次运行pod和第二次运行pod都去远程拉了镜像
kubectl delete ns mayikt-sit
kubectl create ns mayikt-sit
kubectl create -f mayikt-pod-info03.yml
kubectl describe pods -n mayikt-sit
kubectl get pods -n mayikt-sit
apiVersion: v1
kind: Pod # 类型为pod
metadata:
name: mayikt-pod01
namespace: mayikt-sit
labels:
user: v1 ## 标签值
spec:
containers:
- name: nginx ##容器1
image: nginx:1.17.9
env: #设置环境变量列表
- name: "username"
value: "mayikt"
- name: "age"
value: "22"
1.kubectl delete ns mayikt-sit
2.kubectl create ns mayikt-sit
3.kubectl create -f mayikt-pod-info04.yml
4.
kubectl describe pods -n mayikt-sit
kubectl get pods -n mayikt-sit
5.进入 pod里面 容器
kubectl exec -it mayikt-pod01 -n mayikt-sit -c nginx /bin/sh
kubectl exec -it pod的名称 -n 命名空间 -c 容器名称 /bin/sh
输入echo $username
输入echo $age
name <string> # 端口的名称,name在pod中是唯一的不允许重复
containerPort<integer> #容器要暴露的端口 (0
hostPort <integer> #容器要映射到主机上的端口
hostIP <string> # 容器要映射到主机的IP(-般省略)
protocol <string> # 端口协议,必须是UDP、TCP或SCTP。 默认为“TCP"。
apiVersion: v1
kind: Pod # 类型为pod
metadata:
name: mayikt-pod01
namespace: mayikt-sit
labels:
user: v1 ## 标签值
spec:
containers:
- name: nginx ##容器1
image: nginx:1.17.9
env: #设置环境变量列表
- name: "username"
value: "mayikt"
- name: "age"
value: "22"
ports: #设置容器暴露的端口列表
- name: mayikt-port
containerPort: 80
protocol: TCP
1.kubectl delete ns mayikt-sit
2.kubectl create ns mayikt-sit
3.kubectl create -f mayikt-pod-info05.yml
kubectl describe pods -n mayikt-sit
kubectl get pods -n mayikt-sit
可以通过资源配置 pod对应的 cpu核数、内存配置等
1.limits: 限制容器运行时的最大占用资源,当容器占用资源超过limits设置的值时会被终止,并进行重启;
2.requests :用于设置限制容器需要的最小资源,如果环境资源不够,容器则将无法启动
cpu: 核心数数
memory: 内存大小,可以使用Gi、Mi、G、M等形式
apiVersion: v1
kind: Pod # 类型为pod
metadata:
name: mayikt-pod01
namespace: mayikt-sit
labels:
user: v1 ## 标签值
spec:
containers:
- name: nginx ##容器1
image: nginx:1.17.9
resources: #资源配额
limits: #限制资源(上限) 最大资源限制
cpu: "2" #限制 CPU核心线程数
memory: "4Gi" #内存限制
requests: #请求资源(下限) 最小资源限制
cpu: "1" # CPU限制,单位是core数
memory: "5Mi" # 内存限制
1.kubectl delete ns mayikt-sit
2.kubectl create ns mayikt-sit
3.kubectl create -f mayikt-pod-info04.yml
kubectl describe pods -n mayikt-sit
kubectl get pods -n mayikt-sit
演示内存不足
kubectl delete ns mayikt-sit
kubectl create ns mayikt-sit
apiVersion: v1
kind: Pod # 类型为pod
metadata:
name: mayikt-pod01
namespace: mayikt-sit
labels:
user: v1 ## 标签值
spec:
containers:
- name: nginx ##容器1
image: nginx:1.17.9
resources: #资源配额
limits: #限制资源(上限) 最大资源限制
cpu: "2" #限制 CPU核心线程数
memory: "10Gi" #内存限制
requests: #请求资源(下限) 最小资源限制
cpu: "1" # CPU限制,单位是core数
memory: "10Gi" # 内存限制
容器启动成功之后 可以执行一些脚本
创建一个mayikt-pod01
kubectl delete ns mayikt-sit
kubectl create ns mayikt-sit
apiVersion: v1
kind: Pod
metadata:
name: mayikt-pod01
namespace: mayikt-sit
spec:
containers:
- name: nginx
image: nginx:1.17.9
- name: busybox
image: busybox:1.30
执行kubectl create -f pod-initcontainer-demo01.yml
kubectl get pods -n mayikt-sit 查看pod信息 busybox停止了
kubectl describe pods -n mayikt-sit
这是因为busybox容器启动后,它会自动关闭,我们通过启动命令写脚本,让busybox一直在运行。
apiVersion: v1
kind: Pod
metadata:
name: mayikt-pod01
namespace: mayikt-sit
spec:
containers:
- name: nginx
image: nginx:1.17.9
- name: busybox
image: busybox:1.30
command: [ "/bin/sh","-c","while true;do sleep 3; done;"]
“/bin/sh”,“-C”,使用sh执行命令 一直死循环 while true;do sleep 3; done;
为了避免cpu飙高的问题 休眠3s时间。
1.需要在每台节点执行 kubeadm reset
2.在主节点 执行 rm -rf $HOME/.kube
3.直接回到k8s 初始化流程
kubectl的运行在工作节点是需要额外进行配置的,它的配置文件是$HOME/.kube,如果想要在node节点运行此命令,需要将master上的.kube文件复制到node节点上,即在master节点上执行下面操作:
scp -r ~/.kube node2:~/
允许在node1节点上执行kubectl get nodes
报错:
The connection to the server localhost:8080 was refused - did you specify the right host or port?
原因:kubenetes master没有与本机绑定,集群初始化的时候没有设置
在Master节点执行 export KUBECONFIG=/etc/kubernetes/admin.conf
The HTTP call equal to ‘curl -sSL http://localhost:10248/healthz‘ failed with error: Get “http://loc
journalctl -xeu kubelet
[ERROR FileAvailable–etc-kubernetes-manifests-kube-scheduler.yaml]: /etc/kubernetes/manifests/kube-scheduler.yaml already exists
kubeadm reset 重置即可,再执行 kubeadm init
注意:kubeadm reset 重置 需要在 主节点执行 rm -rf $HOME/.kube
journalctl -xeu kubelet -l 查看具体错误日志 在根据具体报错日志分析
你在执行 kubeadm reset命令后没有删除创建的 $HOME/.kube目录
rm -rf $HOME/.kube
kubectl cluster-info —查询集群信息
Unable to connect to the server: dial tcp 192.168.75.163:6443: connect: no route to host
主节点的ip地址发生了变化 变成了 192.168.75.166:6443
kubeadm reset 重置即可,再执行 kubeadm init
解决方法:
查看日志 tail -f /var/log/message
发现是防火墙问题。处理方法:
关闭各个节点的防火墙:
systemctl status firewalld
systemctl stop firewalld
systemctl enable firewalld
重启node节点:
[root@k8s_node02 bin]# systemctl daemon-reload
[root@k8s_node02 bin]# systemctl restart docker
[root@k8s_node02 bin]# systemctl restart kubelet
原因是名称太长
ports:
- name: mayikt-nginx-port
containerPort: 80
ports:
- name: nginx-port
containerPort: 80
9.执行kubectl get nodes 显示 节点ip 不是host文件指定的名称 则直接重启虚拟机
重置节点即可。