文章目录
k8s 中所有的内容都抽象为资源,资源实例化之后,叫做对象。
1. k8s核心资源分类
1.1 工作负载型资源(workload)
- pod:是k8s中最小的单元
- ReplicaSet:调度器,通过标签控制 pod 的副本数目
- Deployment:控制器,管理无状态的应用
- StatefulSet:管理有状态的应用
- DaemonSet:可以在每个节点运行 pod 主键
- Job:批处理
- CronJob:批处理
1.2 服务发现及负载均衡型资源(Service Discovery LoadBalance)
- service
- Ingress
1.3 配置与存储型资源
- Volume(存储卷)
- 云端存储
- 亚马逊弹性块存储
- SAN
- NFS
- GiusterFS(分布式存储)
- 容器存储接口CSI
- ConfigMap(配置中心)
- Secret(保存敏感信息)
- DownwardAPI(将外部环境的信息输出给容器)
1.4 集群级资源
- Namespace:名称空间
- Node:节点
- Role
- ClusterRole
- RoleBinding
- ClusterRoleBinding
1.5 元数据型资源
- HPA:水平扩展的资源
- PodTemplate(pod模板):用于让控制器创建pod是使用的模板
- LimitRange(资源限制)
2. 创建资源的方式
- 使用命令进行创建
- 使用命令式资源清单创建
- apiserver 仅接收json格式的资源定义
- 使用yaml格式提供配置清单,apiserver 可自动将其转为 json 格式并执行 - 使用声明式资源清单创建
- 可以确保资源尽可能向声明的状态靠近,并且可以随时改变声明、随时应用新的声明
3. 资源清单的组成
- apiVersion:apiversion版本
- alpha(内测版)
- beta(公测版)
- stable(稳定版):例如v1 - kind:资源类型
- metadata:资源元数据
- name:同一类别下唯一
- namespace:名称空间
- labels:标签
- annotations:定义污点, - spec:期望的状态
- status:当前的状态、本字段有k8s集群维护,用户不能定义和更改
4. 资源清单格式
是一个 yaml
文件
apiVersion: #指api的版本,一般是v1,定可以使用kubectl api-versions 获取版本信息
kind: #资源类型,例如pod
metadata: #资源元数据
name:
namespace #名称空间,不指定则默认是 default
labels #标签
spec: #详细定义对象
5. 资源清单配置实例
5.1 pod yaml
//暴露端口可以在外部访问
[root@k8s-master ~]# vim pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: myweb-123
namespace: lxr #指定名称空间,这是我事先通过 kubectl create ns lxr 创建的
labels:
app: myweb
spec:
containers:
- name: web1
image: lxr909626/httpd:v0.1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
hostPort: 8080 #这个端口必须是有效的,不能随便写
[root@k8s-master ~]# kubectl create -f pod.yaml
pod/myweb-123 created
[root@k8s-master ~]# kubectl get pods -n lxr -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myweb-123 1/1 Running 0 10s 10.244.2.16 k8s-node2.example.com <none> <none>
一个pod创建两个容器
[root@k8s-master ~]# vim pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: myweb-123
namespace: lxr
labels:
app: myweb
spec:
containers:
- name: web1
image: lxr909626/httpd:v0.1
imagePullPolicy: IfNotPresent
- name: web2
image: busybox
command: ['/bin/sh','-c','sleep 3600']
[root@k8s-master ~]# kubectl create -f pod.yaml
pod/myweb-123 created
[root@k8s-master ~]# kubectl get pods -n lxr -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myweb-123 2/2 Running 0 16s 10.244.2.22 k8s-node2.example.com <none> <none>
//进入容器
[root@k8s-master ~]# kubectl exec -n lxr -it myweb-123 -c web1 -- /bin/sh
/ #
5.2 deployment yaml
[root@k8s-master ~]# vim deploy.yaml
apiVersion: apps/v1 #api版本
kind: Deployment #资源类型
metadata: #元数据定义
name: nginx-deploy #名称
namespace: default #名称空间
labels: #标签
app: nginx-web
spec: #deployment定义
replicas: 3 #定义2个副本
selector: #标签选择器,匹配pod的标签
matchLabels:
app: nginx-web
template: #pod模板定义
metadata:
name: nginx-123
namespace: default
labels: #这里的标签必须和标签选择器的一致
app: nginx-web
spec: #pod内的容器定义
containers:
- name: web
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80 #暴露IP
[root@k8s-master ~]# kubectl create -f deploy.yaml
deployment.apps/nginx-deploy created
[root@k8s-master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deploy-5759d97ff4-42z4b 1/1 Running 0 10s 10.244.1.10 k8s-node1.example.com <none> <none>
nginx-deploy-5759d97ff4-7ghls 1/1 Running 0 10s 10.244.2.26 k8s-node2.example.com <none> <none>
nginx-deploy-5759d97ff4-fcsz5 1/1 Running 0 10s 10.244.2.27 k8s-node2.example.com <none> <none>
//暴露端口到主机
[root@k8s-master ~]# kubectl expose deployment nginx-deploy --port=80 --type=NodePort
service/nginx-deploy exposed
[root@k8s-master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d7h
nginx-deploy NodePort 10.101.226.188 <none> 80:31004/TCP 12s
访问
5.3 service yaml
为上面创建的 Deployment 资源定义service资源
[root@k8s-master ~]# vim svc.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
namespace: default
spec:
selector:
app: nginx-web
type: NodePort
ports:
- nodePort: 30008
port: 80
targetPort: 80
[root@k8s-master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d11h
nginx-svc NodePort 10.97.1.221 <none> 80:30008/TCP 3m16s
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deploy-5d9b7f8766-8ld62 1/1 Running 0 92s 10.244.2.50 k8s-node2.example.com <none> <none>
nginx-deploy-5d9b7f8766-jjk2v 1/1 Running 0 92s 10.244.1.38 k8s-node1.example.com <none> <none>
nginx-deploy-5d9b7f8766-mh8fm 1/1 Running 0 92s 10.244.1.39 k8s-node1.example.com <none> <none>
//查看endpoint资源端点列表
[root@k8s-master ~]# kubectl get endpoints
NAME ENDPOINTS AGE
kubernetes 192.168.249.141:6443 3d11h
nginx-svc 10.244.1.38:80,10.244.1.39:80,10.244.2.50:80 13s