k8s入门教程
一、k8s应用安装
- k8s安装教程:https://www.cnblogs.com/lvlinguang/p/16270133.html
- k3s安装教程:https://www.cnblogs.com/lvlinguang/p/15679754.html
二、集群客户端工具 kubectl
1、检查kubectl是否安装
rpm -qa|grep kubectl
2、获取kubectl帮助方法
kubectl --help
3、kubectl 子命令使用分类
- 基础命令 (Beginner)
命令 | 描述 |
---|---|
create | 通过文件名称或标准输入创建资源 |
expose | 使用 replication controller, service, deployment 或者 pod 并暴露它作为一个 新的 Kubernetes Service |
run | 在集群中运行一个指定的镜像 |
set | 为 objects 设置一个指定的特征 |
- 基础命令 (Intermediate)
命令 | 描述 |
---|---|
explain | 查看资源的文档 |
get | 显示一个或更多 resources |
edit | 在服务器上编辑一个资源 |
delete | 通过文件名、标准输入、资源名称或标签选择器来删除资源 |
- 部署命令
命令 | 描述 |
---|---|
rollout | 管理资源的发布 |
scale | 扩容或缩容Pod数量,Deployment、ReplicaSet、RC或job |
autoscale | 创建一个自动选择扩容或缩容并设置Pod数量 |
- 群集管理命令
命令 | 描述 |
---|---|
certificate | 修改 certificate 资源. |
cluster-info | 显示集群信息 |
top | 显示 Resource (CPU/Memory) 使用. |
cordon | 标记 node 为 unschedulable |
uncordon | 标记 node 为 schedulable |
drain | 驱逐节点上的应用,准备下线维护 |
taint | 更新一个或者多个 node 上的 taints |
- 故障诊断和调试命令
命令 | 描述 |
---|---|
describe | 显示一个指定 resource 或者 group 的 resources 详情 |
logs | 输出容器在 pod 中的日志 |
attach | Attach 到一个运行中的 container |
exec | 在一个 container 中执行一个命令 |
port-forward | 转发一个或多个本地端口到一个pod |
proxy | 运行一个 proxy 到 Kubernetes API server |
cp | 复制 files 和 directories 到 containers 和从容器中复制 files 和 directories. |
auth | 检查授权 |
debug | 创建调试会话以对工作负载和节点进行故障排除 |
- 高级命令
命令 | 描述 |
---|---|
diff | 将实时版本与可能应用的版本区分开来 |
apply | 通过文件名或标准输入流(stdin)对资源进行配置 |
patch | 使用补丁修改、更新资源的字段 |
replace | 通过 filename 或者 stdin替换一个资源 |
wait | 实验性:等待一个或多个资源上的特定条件 |
kustomize | 从目录或URL构建kustomization目标 |
- 设置命令
命令 | 描述 |
---|---|
label | 更新在这个资源上的 labels |
annotate | 更新一个资源的注解 |
completion | 用于实现kubectl工具自动补全 |
- 其它命令
命令 | 描述 |
---|---|
api-resources | 打印受支持的API资源 |
api-versions | 打印受支持的API版本 |
config | 修改 kubeconfig 文件 |
plugin | 运行一个命令行插件 |
version | 输出 client 和 server 的版本信息 |
4、使用kubectl命令的必要环境
- work节点如果想使用kubectl命令,需要从master节点复制config文件
mkdir .kube
scp k3s-master1:/root/.kube/config .kube/
# 使用命令验证
kubectl get nodes
三、常用命令
1、node节点操作
# 得到节点信息
kubectl get node -o wide
# 删除node节点
kubectl delete node node名称
2、命名空间操作
# 查看所有命名空间
kubectl get namespace
# 创建命名空间
kubectl create namespace 空间名称
# 删除命名空间
kubectl delete namespaces 空间名称
3、deployment操作
# 查看deployment
kubectl get deployment -n default
# 详情
kubectl describe deployment deployment名称 -n default
# 删除deployment
kubectl delete deployment deployment名称 -n default
4、pod操作
# 查看pod
kubectl get pod -n default
# pod详情
kubectl describe pod pod名称 -n default
# 删除pod
kubectl delete pod pod名称 -n default
# 前最新的200条日志
kubectl logs --tail 200 -f pod名称 -n default
5、service操作
# 查看service
kubectl get service -n default
# 详情
kubectl describe service svc名称 -n default
# 删除service
kubectl delete service svc名称 -n default
6、显示top资源
# 查看node top资源
kubectl top node
# 查看pod top资源
kubectl top pod --all-namespaces
7、资源清单
# 部署yaml
kubectl apply -f xxx.yaml
# 删除yaml
kubectl delete -f xxx.yaml
四、集群资源清单(YAML)文件
1、基本语法
- 使用空格作为缩进
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
- 低版本缩进时不允许使用Tab键,只允许使用空格
- 使用#标识注释,从这个字符一直到行尾,都会被解释器忽略
2、YAML支持的数据结构
-
对象:
- 键值对的集合
- 又称为映射(mapping) / 哈希(hashes) / 字典
(dictionary)
对象类型:对象的一组键值对,使用冒号结构表示 name: Tom age: 18 Yaml 也允许另一种写法,将所有键值对写成一个行内对象 hash: { name: Tom, age: 18 }
-
数组:
- 一组按次序排列的值
- 又称为序列(sequence) / 列表 (list)
数组类型:一组连词线开头的行,构成一个数组 People - Tom - Jack 数组也可以采用行内表示法 People: [Tom, Jack]
-
纯量(scalars)
- 单个的、不可再分的值
纯量:纯量是最基本的、不可再分的值。以下数据类型都属纯量 数值直接以字面量的形式表示 number: 12.30 布尔值用true和false表示 isSet: true null用 ~ 表示 parent: ~ 时间采用 ISO8601 格式 iso8601: 2001-12-14t21:59:43.10-05:00 日期采用复合 iso8601 格式的年、月、日表示 date: 1976-07-31 YAML 允许使用两个感叹号,强制转换数据类型 e: !!str 123 f: !!str true 字符串默认不使用引号表示 str: 这是一行字符串 如果字符串之中包含空格或特殊字符,需要放在引号之中 str: '内容: 字符串' 单引号和双引号都可以使用,双引号不会对特殊字符转义 s1: '内容\n字符串' s2: "内容\n字符串" 单引号之中如果还有单引号,必须连续使用两个单引号转义 str: 'labor''s day' 字符串可以写成多行,从第二行开始,必须有一个单空格缩 进。换行符会被转为 空格 str: 这是一段 多行字 符串 多行字符串可以使用|保留换行符,也可以使用>折叠换行 this: | Foo Bar that Foo Bar
3、资源清单描述方法
- 在k8s中,一般使用YAML格式的文件来创建符合我们预期期望的pod,这样的YAML文件成为资源清单。
3.1、常用字段
3.2、举例说明
- 创建一个namespace
apiVersion: v1
kind: Namespace
metadata:
name: test
- 创建一个pod
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: nginx-containers
image: nginx:latest
五、NameSpace(命名空间)
1、场景介绍
我们接到项目组同事的第一个任务,需要准备两套k8s集群用于开发测试及预发布,但是由
于项目组可用主机资源有限,没有那么多主机可用,不能满足两套k8s集群的要求,所以播仔就想在现有的k8s集群中运行两套环境,你觉得可行吗?答案是可行的,我们可以使用k8s集群中的命名空间即可实现开发测试与预发布环境的隔离。
2、NameSpace介绍
- 命名空间
- 作用:多租户情况下,实现资源隔离
- 属于逻辑隔离
- 属于管理边界
- 不属于网络边界
- 可以针对每个namespace做资源配额
3、查看NameSpace
kubectl get namespace
默认命名空间说明
- default 用户创建的pod默认在此命名空间
- kube-public 所有用户均可以访问,包括未认证用户
- kube-node-lease kubernetes集群节点租约状态 v1.13加入
- kube-system kubernetes集群在使用
4、创建NameSpace
- 通过kubectl命令行创建
kubectl create namespace test
- 通过Kubectl命令应用资源清单文件创建
# 创建资源清单
vim 01-create-ns.yaml
#内容如下
apiVersion: v1
kind: Namespace
metadata:
name: demons1
# 应用资源清单文件
kubectl apply -f 01-create-ns.yaml
5、删除NameSpace
注:删除命名空间的同时,命名空间中包含所有的资源对象同时被删除
- 通过kubectl命令行删除
kubectl delete namespace test
- 通过kubectl命令应用资源清单文件删除
kubectl delete -f 01-create-ns.yaml
六、集群核心概念 Pod
1、场景介绍
如果我们想在k8s集群中运行应用程序,应该使用什么资源对象呢?我们知道k8s集群中是不能直接运行容器的,k8s集群中最小调度单元为Pod,因此我们要使用Pod来运行应用程序。
2、Pod介绍
- Pod是kubernetes集群能够调度的最小单元
- Pod是容器的封装
3、查看Pod
- 查看default命名空间中的Pod
kubectl get pod
或
kubectl get pods
或
kubectl get pods --namespace default
或
kubectl get pod --namespace default
4、创建Pod
- 编写用于创建Pod资源清单文件(02-create-pod.yaml)
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: ngninx-pod
image: nginx:latest
ports:
- name: nginxport
containerPort: 80
- 应用用于创建Pod资源清单文件
kubectl apply -f 02-create-pod.yaml
- 验证Pod是否被创建
kubectl get pods
- 通过指定默认命名空间查看已创建pod
kubectl get pods -n default
- 查看pod更加详细信息
kubectl get pods -o wide
5、Pod访问
curl 10.72.1.11
6、删除Pod
- kubectl 命令行删除
kubectl delete pods pod1
- 通过kubectl通过Pod资源清单文件删除
kubectl delete -f 02-create-pod.yaml
七、集群核心概念 Controller
1、Controller介绍
- 控制器
- 用于对应用运行的资源对象进行监控
- 当pod出现问题的时候,会把Pod重新拉起,以达到用户期望的状态
2、Controller分类
控制器名称 | 作用 |
---|---|
Deployment | 声明式更新控制器,用于发布无状态应用 |
ReplicaSet | 副本集控制器,用于对Pod进行副本规模扩大或剪裁 |
StatefulSet | 有状态副本集,用于发布有状态应用 |
DeamonSet | 在k8s集群每一个Node上运行一个副本,用于发布监控或日志收集类等应用 |
Job | 运行一次性作业任务 |
CronJob | 运行周期性作业任务 |
3、Deployment 控制器介绍
- 具有上线部署,滚动升级,创建副本,回滚以前某一版本(成功/稳定)等功能
- Deployment包含ReplicaSet,除非需要自定义升级功能或者不需要升级Pod,否则还是建议使用Deployment而不直接使用Replica Set。
4、创建Deployment控制器应用
4.1通过kubectl命令行创建
- kubectl命令创建
kubectl run nginx-app --image=nginx:latest --image-pull-policy=IfNotPresent --replicas=2
说明
nginx-app 是deployment控制器类型的应用名称
nginx:latest 是应用运行的Pod中的Container所使用的镜像
IfNotPresent 是Container容器镜像下载策略,如果本地有镜像,使用本地,如果本地没有镜像,下载镜像
--replicas 是指应用运行的Pod共计2个副本,这是用户的期望值
- 查看Deployment控制器类型
kubectl get deployment
或
kubectl get deployment.apps
- 查看ReplicaSet控制器类型
kubectl get replicaset
或
kubectl get replicaset.apps
4.2、通过资源清单文件创建
- 创建03-creat-deployment-app.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-app
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx-app-container
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- name: nginx-app2
containerPort: 80
5、删除Deployment
带有控制器类型的Pod不能随便删除,如果必须删除,请删除控制器类型的应用名称
- 通过kubectl命令行删除
# 查询
kubectl get deployment.apps
# 删除
kubectl delete deployment.apps nginx-app
- 通过kubectl应用资源清单删除
kubectl delete -f 03-creat-deployment-app.yaml
八、集群核心概念 Service
1、Service介绍
- 不是实体服务
- 只是一条iptables或者ipvs的转发规则
2、Service作用
- 通过Service为Pod的客户端提供访问pod方法,及客户端访问pod入口
- Service通过pod标签与pod进行关联
3、Service类型
- ClusterIp
- 默认,分配一个集群内部可以访问的虚拟IP
- NodePort
- 在每个Node上分配一个端口作为外部访问入口
- LoadBalancer
- 工作在特定的Cloud Provide上,例如Google Cloud。AWS,OpenStack
- ExternalName
- 表示把集群外部的服务引入到集群内部中来,即实现了集群内部pod和集群外部的服务进行通信
4、Service参数
- port:访问service使用的端口
- targetPort:Pod中容器端口
- NodePort:通过Node实现外网用户访问k8s集群内service(30000-3267)
5、Service创建
5.1、通过命令行创建
- 默认创建Service为ClusterIP类型
- 创建Service与Deployment类型应用关联
kubectl expose deployment.apps nginx-app --type=ClusterIP --target-port=80 --port=80
说明
expose 创建service
deployment.apps 控制器类型
nginx-app 应用名称,也是service名称
--type=ClusterIP 指定service类型
--target-port=80 指定pod中容器端口
--port=80 指定service端口
5.2、通过资源清单创建
- 编写用于创建Service资源清单文件(04-create-deployment-service-clusterip.yaml)
apiVersion: v1
kind: Service
metadata:
name: nginx-apps-svc
spec:
type: ClusterIP
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
- 创建NodePort类型Service
apiVersion: v1
kind: Service
metadata:
name: nginx-apps-svc
spec:
type: NodePort
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30001
- 验证NodePort端口
ss -anput | grep ":30090"
6、删除service
- 通过命令行删除
# 查询
kubectl get service
或
kubectl get svc
# 删除
kubectl delete service nginx-apps-svc
- 通过资源清单文件删除
kubectl delete -f 04-create-deployment-service-clusterip.yaml
九、ingress学习
1、http代理访问
vim 18-ingress-nginx-http-01.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-nginx-http
spec:
ingressClassName: nginx
rules:
- host: foo.bar.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-service-nodeport
port:
number: 80
- 目标重写
vim 21-ingress-nginx-01.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-nginx-rewrite-1
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
ingressClassName: nginx
rules:
- host: foo.bar.com
http:
paths:
- path: /open/api(/|$)(.*)
pathType: Prefix
backend:
service:
name: nginx-service-nodeport
port:
number: 80
十、ConfigMap使用
- ConfigMap是一种API对象,用来将非加密数据保存到键值对中。可以用作环境变量、命令行参数或者存储卷中的配置文件。
- ConfigMap就是为了让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性,因为一个configMap其实就是一系列配置信息的集合,将来可直接注入到Pod中的容器使用,而注入方式有两种,一种将configMap做为存储卷,一种是将configMap通过env中configMapKeyRef注入到容器中
1、ConfigMap创建
- 通过命令行创建
kubectl create configmap screen-config1 --from-literal=key1=hello --from-literal=key2=word
- 通过yaml文件创建
apiVersion: v1
kind: ConfigMap
metadata:
name: screen-config
data:
key1: hello
key2: world
2、ConfigMap的使用
Pod的使用方式:
- 将ConfigMap中的数据设置为容器的环境变量
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: ngninx-pod
image: nginx:latest
ports:
- name: nginxport
containerPort: 80
env:
- name: KEY1
valueFrom:
configMapKeyRef:
name: screen-config
key: key1
- name: KEY2
valueFrom:
configMapKeyRef:
name: screen-config
key: key2
- 将ConfigMap中的数据设置为命令行参数
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: ngninx-pod
image: nginx:latest
ports:
- name: nginxport
containerPort: 80
command: [ "/bin/sh","-c","echo $(KEY1) $(KEY2)"]
env:
- name: KEY1
valueFrom:
configMapKeyRef:
name: screen-config
key: key1
- name: KEY2
valueFrom:
configMapKeyRef:
name: screen-config
key: key2
3、查看ConfigMap
kubectl get configmap
十一、应用例子
- 基础例子
apiVersion: v1
kind: Service
metadata:
name: rapid-screen-back
spec:
type: NodePort
selector:
app: screen
ports:
- protocol: TCP
port: 8080
targetPort: 8080
nodePort: 30001
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: rapid-screen-back
spec:
replicas: 2
selector:
matchLabels:
app: screen
template:
metadata:
labels:
app: screen
spec:
containers:
- name: rapid-screen-back
image: 192.168.3.12:6007/library/rapid-screen-back:v1.0.1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
- 基础例子(命名空间、标签)
apiVersion: v1
kind: Namespace
metadata:
name: my-springboot
---
apiVersion: v1
kind: Service
metadata:
name: rapid-screen-back
namespace: my-springboot
labels:
app: rapid-screen-back-svc
spec:
type: NodePort
selector:
app: screen
ports:
- protocol: TCP
port: 8080
targetPort: 8080
nodePort: 30001
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: rapid-screen-back
namespace: my-springboot
labels:
app: rapid-screen-back-dept
spec:
replicas: 2
selector:
matchLabels:
app: screen
template:
metadata:
labels:
app: screen
spec:
containers:
- name: rapid-screen-back
image: 192.168.3.12:6007/library/rapid-screen-back:v1.0.1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
十二、入门视频教程
- k3s/k83学习有一定门槛,通过入门视频教程能够快速掌握基础知识,推荐大家学习
- 百度网盘地址如下,推荐大家直接从第6章开始学习
链接:https://pan.baidu.com/s/101YH_l0DthYLvMX-5a69qA
提取码:3faf