集群:
master
worker --node
Pod:
应用最终以pod为一个基本单位部署
Label:
很多资源都可以打标签
Deployment:
应用部署它,deployment最终会产生pod
Service:
负载均衡机制。
1.k8s里面操作的资源实体,就是k8s的对象,可以使用yaml来声明对象。然后让k8s根据yaml的声明
创建出这个对象;kubectl create/run /expose…
2.操作 Kubernetes 对象 —— 无论是创建、修改,或者删除 —— 需要使用 Kubernetes API。比如,当
使用 kubectl 命令行接口时,CLI 会执行必要的 Kubernetes API 调用
3.Kubernetes对象指的是Kubernetes系统的持久化实体,所有这些对象合起来,代表了你集群的实际
情况。常规的应用里,我们把应用程序的数据存储在数据库中,Kubernetes将其数据以Kubernetes
对象的形式通过 api server存储在 etcd 中。具体来说,这些数据(Kubernetes对象)描述了:
集群中运行了哪些容器化应用程序(以及在哪个节点上运行)
集群中对应用程序可用的资源(网络,存储等)
应用程序相关的策略定义,例如,重启策略、升级策略、容错策略
其他Kubernetes管理应用程序时所需要的信息
scheduler先计算应该去哪个节点部署
对象的spec和status:
每一个k8s对象都包含了两个重要的字段
spec:必须由你来提供,描述了您对该对象所期望的目标状态
status:只能由k8s系统修改,描述了该对象在kubernetes系统的实际状态
kubernetes通过对应的控制器,不断的使实际状态趋向与您期望的目标状态
### 最终一致。
## etcd保存的创建资源期望的状态和最终这个资源的状态要是一致的;spec和status要最终一致
## 1、kubectl create deployment my-nginx --image=nginx
## 2、api-server保存etcd,controller-manager最终解析数据,知道集群要my-nginx一份,保存到etcd
## 3、kubelet就做一件事情,spec状态和最终状态一致
如何编写一个yaml
## kubectl run my-nginx666 --image=nginx #启动一个Pod
## 1、kubectl get pod my-nginx666 -oyaml 集群中挑一个同类资源,获取出他的yaml。
## 2、kubectl run my-tomcat --image=tomcat --dry-run -oyaml 干跑一遍
kubectl run my-tomcat --image=tomcat --dry-run -oyaml 干跑一遍
apiVersion: v1 #同一个资源有可能有多个版本。看 kubectl api-resources提示的。
kind: Pod #资源类型 kubectl api-resources:可以获取到所有资源
metadata: #每一个资源定义一些元数据信息
creationTimestamp: null
labels:
run: mytomcat
name: mytomcat
spec: #资源的规格(镜像名、镜像的环境变量信息等等)
containers:
- image: tomcat
name: mytomcat
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
kubectl api-resources | grep pod
1.apiVersion 用来创建对象时所使用的Kubernetes API版本
2.kind 被创建对象的类型
3.metadata 用于唯一确定该对象的元数据:包括 name 和 namespace ,如果 namespace 为空,
则默认值为 default
4.spec 描述您对该对象的期望状态
不同类型的 Kubernetes,其 spec 对象的格式不同(含有不同的内嵌字段),通过 API 手册 可
以查看 Kubernetes 对象的字段和描述。例如,假设您想了解 Pod 的 spec 定义,可以在 这里找
到,Deployment 的 spec 定义可以在 这里 找到
https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.21/
kind: Pod
apiVersion: v1
#以上 type信息结束
metadata:
name: my-tomcat-test # 资源的名字
# 以上是元数据部分
spec: # 指定规格信息
containers: # 指定要启动一个什么样的容器
- image: tomcat #指定镜像
name: my-tomcat #容器的名字
# 以上是资源的完整规格描述部分 以上是我们必须会编写的
status: {}
#status不用我们写,是k8s集群实时更新的状态信息,
#只要资源变化,kubelet会请求api-server保存最新的资源状态信息
#对比修改完的配置文件的更新内容
kubectl diff -f deploy2.yaml
#删除应用
kubectl delete -f deploy2.yaml
同一个Kubernetes对象应该只使用一种方式管理,否则可能会出现不可预期的结果
#1、命令式
kubectl run nginx --image nginx
kubectl create deployment nginx --image
nginx apply -f : 没有就创建,有就修改
#2、指令性
- 使用指令性的对象配置(imperative object configuration)时,需要向 kubectl 命令指定具体 的操作(create,replace,apply,delete等),可选参数以及至少一个配置文件的名字。配置文件中必须 包括一个完整的对象的定义,可以是 yaml 格式,也可以是 json 格式。
#创建对象
kubectl create -f nginx.yaml
#删除对象
kubectl delete -f nginx.yaml -f redis.yaml
#替换对象
kubectl replace -f nginx.yaml
#3、声明式
#处理 configs 目录中所有配置文件中的Kubernetes对象,根据情况创建对象、或更新Kubernetes中已 经存在的对象。可以先执行 diff 指令查看具体的变更,然后执行 apply 指令执行变更;
kubectl diff -f configs/
kubectl apply -f configs/
#递归处理目录中的内容:
kubectl diff -R -f configs/
kubectl apply -R -f configs/
#移除
kubectl delete -f configs/
kubectl get namespaces
kubectl describe namespaces
Kubernetes 安装成功后,默认有初始化了三个名称空间:
1.default 默认名称空间,如果 Kubernetes 对象中不定义 metadata.namespace 字段,该对象将放
在此名称空间下
2.kube-system Kubernetes系统创建的对象放在此名称空间下
3…kube-public 此名称空间自动在安装集群是自动创建,并且所有用户都是可以读取的(即使是那些
未登录的用户)。主要是为集群预留的,例如,某些情况下,某些Kubernetes对象应该被所有集群
用户看到。
名称空间如何隔离:
访问其他名称空间的东西? 名称空间资源隔离,网络不隔离
1.配置直接拿来用。不行
2.网络访问,可以
serviceName来访问,找本名称空间的Service负载均衡
serviceName.名称空间, 可以访问别的名称空间的
# 创建
kubectl create ns <名称空间的名字>
#删除
kubectl delete ns <名称空间的名字>
#使用yaml方式创建名称空间
kubectl create ns world2 --dry-run=client -oyaml
apiVersion: v1
kind: Namespace
metadata:
creationTimestamp: null
name: world2
spec: {}
status: {}
apiVersion: v1
kind: Namespace
metadata:
creationTimestamp: null
name: k8s-001 #名称空间的名字
spec: {}
status: {}
名称空间的名字必须与 DNS 兼容:
1.不能带小数点 .
2.不能带下划线 _
3.使用数字、小写字母和减号 - 组成的字符串
默认情况下,安装Kubernetes集群时,会初始化一个 default 名称空间,用来将承载那些未指定名称
空间的 Pod、Service、Deployment等对象
为请求设置名称空间:
#要为当前请求设置命名空间,请使用 --namespace 参数。
kubectl run nginx --image=nginx --namespace=
kubectl get pods --namespace=
并非所有的对象都再命名空间中:
大多数 kubernetes 资源(例如 Pod、Service、副本控制器等)都位于某些命名空间中。但是命名空间资
源本身并不在命名空间中。而且底层资源,例如 nodes 和持久化卷不属于任何命名空间。
查看哪些 Kubernetes 资源在命名空间中,哪些不在命名空间中:
# In a namespace
kubectl api-resources --namespaced=true
# Not in a namespace
kubectl api-resources --namespaced=false
标签(Label)是附加在Kubernetes对象上的一组名值对,其意图是按照对用户有意义的方式来标识
Kubernetes对象,同时,又不对Kubernetes的核心逻辑产生影响。标签可以用来组织和选择一组
Kubernetes对象。您可以在创建Kubernetes对象时为其添加标签,也可以在创建以后再为其添加标签。
每个Kubernetes对象可以有多个标签,同一个对象的标签的 Key 必须唯一
#加标签
kubeclt label pod nginx-deployment-746fbb99df-49t7w aaa=bbb
#查看标签
kubectl get pod --show-labels
#删除标签
kubeclt label pod nginx-deployment-746fbb99df-49t7w aaa-
#解释标签:
kubectl explain pod.metadata.labels
使用yaml文件如何写标签:
kind: Pod
apiVersion: v1
#以上 type信息结束
metadata:
name: my-nginx-labels # 资源的名字
labels:
aa: bb #指定标签
cc: dd
app: my-nginx
# 以上是元数据部分
spec: # 指定规格信息
containers: # 指定要启动一个什么样的容器
- image: nginx #指定镜像
name: my-nginx #容器的名字
三个命令玩转所有的yaml写法:
kubectl get xxx -oyaml
kubectl create deploy xxxxx --dry-run-client -oyaml
kubectl explain pod.spec.xx
kubeadm安装的集群。二进制后来就是 yum install etcd api-server
认识核心文件夹 /etc/kubernetes . 以Pod方式安装的核心组件。
etcd,api-server,scheduler。(安装k8s的时候,yum kubeadm kubelet kubectl)
回顾集群安装的时候,为什么只有master节点的kubectl可以操作集群
kubelet额外参数配置 /etc/sysconfig/kubelet;
kubelet配置位置 /var/lib/kubelet/config.yaml
kubectl的所有命令参考:
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands
https://kubernetes.io/zh/docs/tasks/tools/included/optional-kubectl-configs-bash-linux/
# 安装
yum install bash-completion
# 自动补全
echo 'source <(kubectl completion bash)' >>~/.bashrc
kubectl completion bash >/etc/bash_completion.d/kubectl \
source /usr/share/bash-completion/bash_completion
#查询基础信息
ps -aux | grep kubelet
镜像:
在 Kubernetes 的 Pod 中使用容器镜像之前,我们必须将其推送到一个镜像仓库(或者使用仓库中已经
有的容器镜像)。在 Kubernetes 的 Pod 定义中定义容器时,必须指定容器所使用的镜像,容器中的
image 字段支持与 docker 命令一样的语法,包括私有镜像仓库和标签。
下载私有仓库镜像:
#这个秘钥默认在default名称空间,不能被hello名称空间共享
kubectl create secret -n hello docker-registry my-aliyun \
--docker-server=registry.cn-hangzhou.aliyuncs.com \
--docker-username=forsumlove \
--docker-password=lfy11223344 # 那个镜像对应哪个仓库没有任何问题
apiVersion: v1 kind: Pod metadata: name: foo spec: containers:
- name: foo image: registry.cn-zhangjiakou.aliyuncs.com/atguigudocker/atguigu-java- img:v1.0 imagePullSecrets:
- name: mydocker
#查看详细下载信息
kubectl describe pod名称 -n hello
验证环境变量:
kind: Pod
apiVersion: v1
metadata:
name: my-mysql
namespace: hello
labels:
aa: bb
bb: dd
spec: # 指定规格信息
containers: # 指定要启动一个什么样的容器
## docker run -e = env --name=name -v=volumeMounts -w /usr/ /bin/bash
- image: mysql:5.7.34 #指定镜像
name: mysql #容器的名字 数据就在容器里面 docker run mysql.
# ports: #指定容器暴露哪些端口 -p
env:
- name: MYSQL_ROOT_PASSWORD
value: cle
- name: MYSQL_DATABASE
value: "itdachang"
workingDir: "/usr/" # Dockerfiel WORKDIR
#volumeMounts: 挂载
验证输出信息:
kind: Pod
apiVersion: v1
metadata:
name: my-command-test
namespace: hello
spec: # 指定规格信息
containers: # 指定要启动一个什么样的容器
- image: nginx #指定镜像。默认会启动一个nginx容器
name: command-test
command: # 以这里为准 ## redis 主节点 redis 启动命令
- /bin/sh
- -c
- "echo $(msg);sleep 3600;"
env:
- name: msg
value: "hello msg" ## Dockerfile CMD 能用到
# 直接覆盖容器的默认命令 Dockerfile ENTRYPOINT CMD 指定容器的启动命令
kubectl logs my-command-test -n hello
Kubernetes中为容器提供了两个 hook(钩子函数):
PostStart
此钩子函数在容器创建后将立刻执行。但是,并不能保证该钩子函数在容器的 ENTRYPOINT 之前
执行。该钩子函数没有输入参数。
PreStop
此钩子函数在容器被 terminate(终止)之前执行,例如:
通过接口调用删除容器所在 Pod
某些管理事件的发生:健康检查失败、资源紧缺等
如果容器已经被关闭或者进入了 completed 状态,preStop 钩子函数的调用将失败。该函数的执
行是同步的,即,kubernetes 将在该函数完成执行之后才删除容器。该钩子函数没有输入参数。
验证:启动pod访问nginx:
kind: Pod
apiVersion: v1
metadata:
name: my-life
namespace: hello
labels:
aa: bb
bb: dd
spec: # 指定规格信息
containers: # 指定要启动一个什么样的容器
- image: nginx #指定镜像
name: nginx #容器的名字 数据就在容器里面 docker run mysql.
lifecycle:
postStart:
# httpGet:
# port: 80
# path: "http://192.168.169.160/postStart"
httpGet:
host: "192.168.179.54"
path: "/postStart"
port: 80
scheme: HTTP
# exec: 容器创建之后,这个钩子程序执行一个命令 echo 1111
# httpGet: 容器创建之后,这个钩子程序发送一个httpGet 请求
# tcpSocket: 容器创建之后,这个钩子程序连上一个TCP端口
preStop: ##
httpGet:
host: "192.168.179.54"
path: "/preStop"
port: 80
scheme: HTTP
Kubernetes 在容器启动后立刻发送 postStart 事件,但是并不能确保 postStart 事件处理程序在容器
的 EntryPoint 之前执行。postStart 事件处理程序相对于容器中的进程来说是异步的(同时执行),
然而**,Kubernetes 在管理容器时,将一直等到 postStart 事件处理程序结束之后,才会将容器的状
态标记为 Running**。
Kubernetes 在决定关闭容器时,立刻发送 preStop 事件,并且,将一直等到 preStop 事件处理程序
结束或者 Pod 的 --grace-period 超时,才删除容器
kubectl explain 解析一个资源Pod改怎么编写yaml
kubectl describe 用来排错的,看资源的状态