kubectl [command] [TYPE] [NAME] [flags]
# comand:指定要对资源执行的操作,例如 create、get、describe 和delete
# TYPE:指定资源类型,资源类型是大小写敏感的,开发者能够以单数、复数和缩略的形式。
# NAME:指定资源的名称,名称也大小写敏感的。如果省略名称,则会显示所有的资源
# flags:指定可选的参数。例如,可用-s 或者–server 参数指定Kubernetes API server 的地址和端口
命令名 | 说明 |
---|---|
kubectl | 前缀 |
create | 通过文件名或标准输入创建资源 |
expose | 将一个资源公开为一个新的Service |
run | 创建并运行一个或多个容器镜像 |
set | 配置资源对象设置特定功能 |
get | 获取一个或多个资源对象的信息 |
explain | 查看资源对象的详细信息(文档参考资料) |
edit | 使用默认编辑器编辑服务器上定义的资源对象 |
delete | 通过文件名、标准输入、资源名称或标签选择器来删除资源 |
命令名 | 部署命令说明 |
---|---|
kubectl | 前缀 |
rollout | 资源管理对象的部署 |
rollout-update | 对给定的复制控制器滚动更新 |
scale | 扩容或者缩容deployment replicaset replication contrller等 |
autoscale | 自动设置在k8s系统中运行的pod数量(水平自动伸缩) |
命令名 | 集群管理命令说明 |
---|---|
kubectl | 前缀 |
cetificate | 修改证书资源资源 |
cluster-info | 查看集群信息 |
top | 显示资源 cpu 内存 存储使用情况,需要Heapster运行 |
cordon | 标记节点为不可调度 |
uncordon | 指定节点为可调度 |
drain | 安全的驱逐节点的所有pod |
taint | 修改节点taint标记 |
命令名 | 说明 |
---|---|
kubectl | 前缀 |
describe | 显示一个或多个资源对象的详细信息 |
logs | 输出pod资源对象中一个容器的日志 |
attach | 附加到一个运行的容器 |
exec | 在指定容器内执行命令 |
port-forward | 转发一个或多个本地端口到一个pod |
proxy | 将本机指定端口映射到kube-apiserver |
cp | 用于pod与主机交换文件 |
auth | 检查授权 |
命令名 | 说明 |
---|---|
kubectl | 前缀 |
diff | 对比本地json/yaml文件与kube-apiserver中运行的配置文件是否有差异 |
apply | 通过json/yaml文件 标准输入对资源进行配置更新或者创建 |
patch | 通过patch方式修改资源对象字段(补丁式) |
replace | 通过json/yaml文件或者标准输入来替换资源对象 |
wait | 在一个或者多个资源上等待条件达成 |
convert | 转换json/yaml文件为不同的资源版本 |
kustomize | 定制kubernetes配置 |
命令名 | 说明 |
---|---|
kubectl | 前缀 |
label | 更新资源的标签 |
annotate | 更新一个或者多个资源对象的注释(annotaion)信息 |
completion | 实现Kubectl工具自动补全 |
命令名 | 说明 |
---|---|
kubectl | 前缀 |
config | 管理kubeconfig配置文件 |
plugin | 运行命令行插件功能 |
version | 查看客户端服务端的系统版本信息 |
api-versions | 列出当前kubernetes系统支持的资源组和资源版本表现形式为/ |
api-resources | 列出当前kubernetes系统支持的resource资源列表 |
options | 查看支持的参数列表 |
名字 | 说明 |
---|---|
apiVersion | API版本 |
kind | 资源类型 |
metadata | 资源元数据(Pod元数据) |
spec | 资源规格(Pod规格) |
replicas | 副本数量 |
selector | 标签选择器 |
template | Pod模板 |
containers | 容器配置 |
# -o yaml 表示不创建资源,只生成yaml
# --dry-run 表示尝试运行,并不会真正执行
kubectl create deployment haha --image=nginx -o yaml --dry-run
# 实际生成yaml文件
kubectl create deployment haha --image=nginx -o yaml --dry-run > test1.yaml
# deploy 表示类型
# 这里之所以有nginx是上面生成的
kubectl get deploy
kubectl get deploy nginx -o=yaml --export > test2.yaml
name: haha
age: 18
# 或
hash: { name: haha, age: 18 }
people
- zhangsan
- lisi
# 或者
people: [zhangsan, lisi]
# 数值
num: 12
# 布尔
isTrue: true
# null,~表示null
isNull: ~
# 时间
time: 2022-09-14t17:32:15.10-05:00
# 日期
date: 2022-09-14
# 强转 双感叹号表示强制转换数据类型
e: !!str 123
f: !!str true
# 字符串
str: 这是字符串
str: 这是'name: zhangsan' 包含空格或特殊字符需引号
str: 'sss\nsss'
str: "sss\nsss"
str:'zhang''san' # 单引号之间使用单引号许连续2个
str: sss |
asd >
asd
# 表示换行
共享网络
共享存储
引入数据卷概念Volumn,使用数据卷进行数据持久化存储
说明 | |
---|---|
imagePullPolicy: IfNotPresent | 默认值,当镜像在宿主机上不存在时才拉取 |
imagePullPolicy: Always | 每次创建Pod都会重新拉取一次镜像 |
imagePullPolicy: Never | Pod永远不会主动拉取这个镜像 |
说明 | |
---|---|
spec.containers[].resource | 前缀 |
.limits.cpu | cpu最大核数(1核==1000M) |
.limits.memor | 内存最大 |
.requests.cpu | 调度 cpu 核数 |
.requests.cpu | 调度 内存数 |
说明 | |
---|---|
restartPolicy: Always | 当容器终止退出后,总是重启容器,默认策略 |
restartPolicy: OnFailure | 当容器异常退出(状态码非0)时,才重启容器 |
restartPolicy: Never | 当容器终止退出,从不重启容器 |
LivenessProbe(存活检查): 如果检查失败,将杀死容器,根据Pod的restartPolicy来操作
readinessProbe(就绪检查): 如果检查失败,Kubernetes会把Pod从service endpoints中剔除
Probe支持三种检查方法:
1. httpGet 发送HTTP请求,返回200-400范围状态码为成功
2. exec 执行Shell命令返回状态码为0是成功
3. tcpSocket 发起TCP Socket 建立成功
在master节点上
create pod ------> apiserver ------> etcd(存储)
scheduler ------> apiserver ------> etcd(获取)------>调度算法------> node节点
kubelet ------> apiserver ------> 读取etcd拿到分配给当前节点的Pod ------> docker创建容器(或其他容器工具创建容器,因为1.2以后不支持docker)
# 节点选择器指定环境
kubectl label node slave1 env_role=dev
# node---> 指node节点
# slave1 --->指选择那个宿主机
# dev ---> 环境
# 查看
kubectl get nodes slave1 --show-labels
硬亲和性
软亲和性
反亲和性
支持常用操作符
In NotIn Exists Gt Lt DoesNotExists
kubectl describe node master | grep Taint
# env_role ---> key名字
# yes ---> value 值
# NoSchedule ---> 污点值
kubectl taint node slave1 env_role=yes:NoSchedule
# 效果就是现在镜像不会调度到slave1节点上了
kubectl taint node slave1 env_role:NoSchedule-
# 在yaml文件中加上
spec:
tolerations:
-key: "设置污点时的key名称"
operator: "Equal"
value: "设置污点时的value值"
effect: "NoSchedule"
apiVersion: v1
kind: Pod
metadata: //元数据
name: string
namespace: string
labels:
-name: string
annotations:
-name: string
spec:
containers: //pod 中的容器列表,可以有多个容器
- name: string //容器的名称
image: string //容器中的镜像
imagesPullPolicy: [Always|Never|IfNotPresent]//获取镜像的策略,默认值为Always,每次都尝试重新下载镜像
command: [string] //容器的启动命令列表(不配置的话使用镜像内部的命令)args:[string] //启动参数列表
workingDir: string //容器的工作目录 volumeMounts: //挂载到到容器内部的存储卷设置
-name: string
mountPath: string //存储卷在容器内部 Mount 的绝对路径 readOnly: boolean //默认值为读写
ports: //容器需要暴露的端口号列表
-name: string
containerPort: int //容器要暴露的端口
hostPort: int //容器所在主机监听的端口(容器暴露端口映射到宿主机的端口,设置hostPort 时同一 台宿主机将不能再启动该容器的第 2 份副本)
protocol: string //TCP 和 UDP,默认值为 TCP env: //容器运行前要设置的环境列表
-name: string value: string
resources:
limits: //资源限制,容器的最大可用资源数量 cpu: Srting
memory: string
requeste: //资源限制,容器启动的初始可用资源数量 cpu: string
memory: string
livenessProbe: //pod 内容器健康检查的设置 exec:
command: [string] //exec 方式需要指定的命令或脚本 httpGet: //通过httpget 检查健康
path: string port: number host: string scheme: Srtring httpHeaders:
- name: Stirng value: string
tcpSocket: //通过 tcpSocket 检查健康
port: number initialDelaySeconds: 0//首次检查时间 timeoutSeconds: 0 //检查超时时间
periodSeconds: 0 //检查间隔时间
successThreshold: 0
failureThreshold: 0 securityContext: //安全配置
privileged: falae
restartPolicy: [Always|Never|OnFailure]//重启策略,默认值为Always
nodeSelector: object //节点选择,表示将该 Pod 调度到包含这些label 的Node 上,以key:value 格式指定
imagePullSecrets:
-name: string
hostNetwork: false //是否使用主机网络模式,弃用 Docker 网桥,默认否volumes: //在该 pod 上定义共享存储卷列表
-name: string emptyDir: {} hostPath:
path: string secret:
secretName: string item:
-key: string path: string
configMap: name: string items:
-key: string
path: string
# 生成yaml文件
kubectl create deployment web --image=nginx --dry-run -o yaml > web.yaml
# 通过yaml 部署应用
kubectl apply -f web.yaml
# 对外暴露端口生成yaml文件
kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1 -o yaml >web1.yaml
# 部署
kubectl apply -f web1.yaml
# 查看
kubectl get pod,svc
vim /opt/soft/web.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: web
name: web
spec:
replicas: 1
selector:
matchLabels:
app: web
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: web
spec:
containers:
- image: nginx:1.14 #指定版本
name: nginx
resources: {}
status: {}
# 在node节点上通过docker来查看
docker images
# 升级到1.15
kubectl set image deployment web nginx=nginx:1.15
流程介绍:
先下载1.15,在下载的过程1.14还是在运行的,当下载完就替换
kubectl rollout status deployment web
# 查看历史版本
kubectl rollout history deployment web
# 还原到上一个状态
kubectl rollout undo deployment web
# 回滚到指定版本
kubectl rollout undo deployment web --to-revision=2
# 应用场景: 当多人访问时,可以创建副本来进行
# 创建10个副本
kubectl scale deployment web --replicas=10
vim service2.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None # 定义无头ip
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nginx-statefulset # 定义名称
namespace: default
spec:
serviceName: nginx
replicas: 3 # 定义创建副本数
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
kubectl apply -f service2.yaml
有唯一标识
根据主机名+按照一定规则生成域名
每个pod有唯一主机名
唯一域名: 主机名.service名称.名称空间.svc.cluster.local
如: nginx-sataefulset-0.nginx.default.svc.cluster.local
# nginx-sataefulset-0 主机名
# nginx service名称
# default 名称空间
这个 Pod 运行在 k8s 集群里的每一个节点(Node)上;
每个节点上只会运行一个这样的 Pod 实例;
如果新的节点加入 k8s 集群后,该 Pod 会自动地在新节点上被创建出来;
而当旧节点被删除后,它上面的 Pod 也相应地会被回收掉
如: 在每个节点安装数据采集工具
vim service3.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ds-test
labels:
app: filebeat
spec:
selector:
matchLabels:
app: filebeat
template:
metadata:
labels:
app: filebeat
spec:
containers:
- name: logs
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: varlog
mountPath: /tmp/log # 数据采集日志保留的目录
volumes:
- name: varlog
hostPath:
path: /var/log # 容器数据卷
kubectl apply -f service3.yaml
# ds-test-mzx4v pod名字
kubectl exec -it ds-test-mzx4v bash
ls /opt/temp/log
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl # 计算圆周率
command: ["perl", "-Mbignum=bpi", "-wle", "pring bpi(2000)"]
restartPolicy: Never
backoffLimit: 4 # 重启策略,默认6
已经计算完成
kubectl get job
# pi-hhb7 pod名称
kubectl logs pi-hhb7
# 每隔一分钟输出一次
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 k8s
restartPolicy: OnFailure
kubectl get cronjob
kubectl logs hello-1663299480-bp4mw
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: web
name: web
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: web
type: ClusterIP # 设置类型
status:
loadBalancer: {}
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: web
name: web1 # 设置名称
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: web
type: NodePort # 设置类型
status:
loadBalancer: {}
node内网部署应用外网是不能访问的
echo -n 'admin' | base64
echo -n '123456' | base64
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4= # base64编码
password: MTIzNDU2
kubectl get sercret
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: SECRET_PASSWORD
valueFrom:
secreKeyRef:
name: mysecret
key: password
kubectl apply -f secret-val.yaml
kubectl exec -it mypod bash
echo $SECRET_USERNAME
echo $SECRET_PASSWORD
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: foo
mountPath: "/etc/foo" # 挂载位置
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret # 挂载名字
kubectl exec -it mypod bash
ls /etc/foo
vim redis.properties
redis.host=127.0.0.1
redis.port=6379
# 创建 configmap
kubectl create configmap redis-config --from-file=redis.properties
# 查看 cm ---> configmap简称
kubectl get cm
# 查看文件信息
kubectl describe cm redis-config
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: busybox
image: busybox
command: ["/bin/sh", "-c", "cat /opt/soft/yaml/redis.properties"] # 存放redis.properties的目录
volumeMounts:
- name: config-volume
mountPath: /opt/soft/yaml # 存放redis.properties的目录
volumes:
- name: config-volume
configMap:
name: redis-config #要跟configmap名称一样
restartPolicy: Never
kubectl apply -f cm.yaml
kubectl logs mypod
vim config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: myconfig
namespace: default
data:
special.level: info
special.type: hello
kubectl apply -f config.yaml
vim config-var.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: busybox
image: busybox
command: ["/bin/sh", "-c", "echo ${LEVEL} ${TYPE}"]
env:
- name: LEVEL
valueFrom:
configMapKeyRef:
name: myconfig
key: special.level
- name: TYPE
valueFrom:
configMapKeyRef:
name: myconfig
key: special.type
restartPolicy: Never
kubectl apply -f config-var.yaml
kubectl logs mypod
访问k8s集群时候,需要经过三个步骤
进行访问的时候,过程中都需要经过apiserver
认证、传输安全
授权
准入控制
kubectl create ns roledemo
kubectl run nginx --image=nginx -n roledemo
# 查看
kubectl get pod -n roledemo
vim rbac-role.yaml
kink: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: roledemo
name: pod-reader
rules:
- apiGroups: [""] # "" 表示核心API组
resources: ["pods"]
verbs: ["get", "watch", "list"] # 权限
# 创建
kubectl apply -f rbac-role.yaml
# 查看
kubectl get role -n roledemo
vim rbac-rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: roledemo
subjects:
- kind: User
name: username
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
# 创建
kubectl apply -f rbac-rolebinding.yaml
# 查看
kubectl get rolebinding -n roledemo
# 测试
kubectl get pods -n roledemo
kubectl get svc -n roledemo
# 创建pod
kubectl create deployment web --image=nginx
# 对外暴露
kubectl expose deployment web --port=80 --target-port=80 --type=NodePort
# 获取ingress-controller.yaml 文件
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml
mv mandatory.yaml ingress-controller.yaml
# 在213行添加
hostNetwork: true
# 创建
kubectl apply -f ingress-controller.yaml
# 查看
kubectl get pods -n ingress-nginx
vim ingress.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: example-ingress # 名字
spec:
rules:
- host: example.ingredemo.com # 域名
http:
paths:
- path: /
backend:
serviceName: web # pod名字
servicePort: 80 # 端口
# 创建
kubectl apply -f ingress.yaml
# 查看 pod
kubectl get pods -n ingress-nginx -o wide
kubectl get ing
# 在对应节点上查看端口
netstat -antp |grep 443
netstat -antp |grep 80
C:\Windows\System32\drivers\etc 目录下的hosts
增加域名映射
192.168.10.103 example.ingredemo.com
helm:一个命令行客户端工具,主要用于 Kubernetes 应用 chart 的创建、打包、发布和管理。
Chart:应用描述,一系列用于描述 k8s 资源相关文件的集合。
Release:基于 Chart 的部署实体,一个 chart 被 Helm 运行后将会生成对应的一个release;将在 k8s 中创建出真实运行的资源对象。
github地址:https://github.com/helm/helm/releases
下载地址
tar -zxvf helm-v3.0.0-linux-amd64.tar.gz
cd linux-amd64/
cp helm /usr/bin/
添加仓库
# 添加微软仓库
# weiruan ---> 仓库名
helm repo add weiruan http://mirror.azure.cn/kubernetes/charts
# 添加阿里云仓库
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
# 更新仓库
helm repo update
# 仓库列表
helm repo list
# 删除仓库
helm repo remove aliyun
helm search repo 应用名称
# 如:weave 是可视化监控
helm search repo weave
helm install 安装后的名称 搜索的应用名称
# 如:
helm install ui weiruan/weave-scope
# 查看安装之后的状态
helm list
helm status 名称
# 修改ui的对外暴露端口
kubectl edit svc ui-weave-scope
# 通过浏览器查看
helm create mychart
cd mychart
cd templates
# 删除templates中自带文件
rm -rf *
# 创建 deployment.yaml
kubectl create deployment web1 --image=nginx --dry-run -o yaml > deployment.yaml
# 创建 service.yaml
kubectl expose deployment web1 --port=80 --target-port=80 --type=NodePort --dry-run -o yaml > service.yaml
# 如果这里报了未找到的错误,那么可以先创建出pod在执行
# 如果报安装冲突先删除前面创建的,或者修改yaml中名字
cd ../../
helm install web1 mychart/
helm upgrade web1 mychart/
replicas: 1
image: nginx
tag: 1.16
label: nginx
port: 80
# 后面的表达式是获取你创建时的传参
表达式: {{ .Values.变量名}} || {{ .Release.Name}}
修改deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: {{.Values.label}}
name: {{ .Release.Name}}-deploy
spec:
replicas: {{.Values.replicas}}
selector:
matchLabels:
app: {{.Values.label}}
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: {{.Values.label}}
spec:
containers:
- image: {{.Values.image}}
name: nginx
resources: {}
status: {}
修改service.yaml
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: {{.Values.label}}
name: {{ .Release.Name}}-service
spec:
ports:
- port: {{ .Values.port}}
protocol: TCP
targetPort: 80
selector:
app: {{ .Values.label}}
type: NodePort
status:
loadBalancer: {}
# 尝试执行,可以查看生成的yaml文件
helm install --dry-run web2 mychart/
# 执行
helm install web2 mychart/
yum -y install nfs-utils
vim /etc/exports
# /opt/data/nfs 是挂载路径
# *表示所有内容 rw表示读写权限
/opt/data/nfs *(rw,no_root_squash)
mkdir -p /opt/data/nfs
yum -y install nfs-utils
systemctl start nfs
ps -ef | grep nfs
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-nfs1
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: wwwroot
mountPath: /opt/temp/html
ports:
- containerPort: 80
volumes:
- name: wwwroot
nfs:
server: 192.168.10.101
path: /opt/data/nfs
kubectl apply -f nfs.yaml
kubectl get pods
kubectl exec -it nginx-nfs1-6545f8b7fd-ch5qb bash
cd /opt/temp/html/
ls
# 执行下面代码后
ls
# 在nfs服务端上
cd /opt/data/nfs/
vim index.html
# 随便写点内容
vim /opt/pv/pvc.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-nfs1
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: wwwroot
mountPath: /usr/share/nginx/html
ports:
- containerPort: 80
volumes:
- name: wwwroot
persistentVolumeClaim:
claimName: my-pvc
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteMany # 读写
resources:
requests:
storage: 5Gi # 容量
kubectl apply -f pvc.yaml
vim /opt/pv/pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
nfs:
path: /opt/data/nfs
server: 192.168.10.101
查看
kubectl get pv,pvc