1、资源创建方式:
● 命令行 ● YAML
2、Namespace:
名称空间用来隔离资源
kubectl create ns hello
kubectl delete ns hello
kubectl get ns
kubectl apply -f hello.yaml
kubectl delete -f hello.yaml
apiVersion: v1
kind: Namespace
metadata:
name: hello
3、pod:
运行中的一组容器,Pod是kubernetes中应用的最小单位.
kubectl get pod #查看默认名称空间的pod
kubectl get pod -A #查看所有pod
kubectl get pod -n kube-system #查看namespace下的pod
# 运行pod
kubectl run mynginx --image=nginx
# 描述pod
kubectl describe pod mynginx
#Events:
# Type Reason Age From Message
# ---- ------ ---- ---- -------
# Normal Scheduled 4m40s default-scheduler Successfully assigned default/mynginx to kubadmin-k8s-node1
# Normal Pulling 4m28s kubelet, kubadmin-k8s-node1 Pulling image "nginx"
# Normal Pulled 4m11s kubelet, kubadmin-k8s-node1 Successfully pulled image "nginx"
# Normal Created 4m11s kubelet, kubadmin-k8s-node1 Created container mynginx
# Normal Started 4m10s kubelet, kubadmin-k8s-node1 Started container mynginx
# 查看pod拉起的容器
docker ps | grep mynginx
# 删除pod
kubectl delete pod mynginx -n default(namespace)
# 查看日志
kubectl logs mynginx
kubectl logs -f mynginx
# 每个Pod - k8s都会分配一个ip
kubectl get pod -owide
# 使用Pod的ip+pod里面运行容器的端口
curl 10.244.2.10:80
# 进入pod命令
kubectl exec -it mynginx -- /bin/bash
# 集群中的任意一个机器以及任意的应用都能通过Pod分配的ip来访问这个Pod
yaml方式创建
apiVersion: v1
kind: Pod
metadata:
labels:
run: mynginx
name: mynginx
spec:
containers:
- image: nginx
name: mynginx
创建多容器pod
apiVersion: v1
kind: Pod
metadata:
labels:
run: myapp
name: myapp
spec:
containers:
- image: nginx
name: nginx
- image: tomcat:8.5.68
name: tomcat
4、Deployment:
控制Pod,使Pod拥有多副本,自愈,扩缩容等能力
# 清除所有Pod,比较下面两个命令有何不同效果?
kubectl run mynginx --image=nginx
# 自愈能力,机器宕机后可以重新拉起
kubectl create deployment mytomcat --image=tomcat:8.5.68
kubectl get deployment
# 删除deployment
kubectl delete deployment my-dep-01
4.1 多副本
kubectl create deployment my-dep --image=nginx --replicas=3
kubectl version
使用yaml创建
kubectl apply -f deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: my-dep
name: my-dep
spec:
replicas: 3
selector:
matchLabels:
app: my-dep
template:
metadata:
labels:
app: my-dep
spec:
containers:
- image: nginx
name: nginx
4.2 扩缩容
kubectl scale --replicas=5 deployment/my-dep
kubectl edit deployment/my-dep
#修改 replicas
4.3 自愈&故障转移
● 停机 ● 删除Pod ● 容器崩溃
演示自愈能力
kubectl get pods -owide
#NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
#my-dep-548d78dc5c-2phxq 1/1 Running 0 19m 10.244.1.16 kubadmin-k8s-node1 <none> <none>
#my-dep-548d78dc5c-zzmp7 1/1 Running 0 24m 10.244.1.15 kubadmin-k8s-node1 <none> <none>
# 在node1节点上查找my-dep-548d78dc5c-2phxq启动的容器
# node1 节点执行
docker ps | grep my-dep-548d78dc5c-2phxq
#79bb042f2ede nginx "/docker-entrypoint.…" 22 minutes ago Up 22 minutes k8s_nginx_my-dep-548d78dc5c-2phxq_default_c895f3e6-16a0-4375-a00f-b0b6102aa428_0
#f0589e51aaab registry.aliyuncs.com/google_containers/pause:3.2 "/pause" 22 minutes ago Up 22 minutes k8s_POD_my-dep-548d78dc5c-2phxq_default_c895f3e6-16a0-4375-a00f-b0b6102aa428_0
# 停止容器
docker stop 79bb042f2ede
# 重新查看pod状态
kubectl get pods -owide
#NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
#my-dep-548d78dc5c-2phxq 1/1 Running 1 27m 10.244.1.16 kubadmin-k8s-node1 <none> <none>
#my-dep-548d78dc5c-zzmp7 1/1 Running 0 32m 10.244.1.15 kubadmin-k8s-node1 <none> <none>
# pod已重启
kubectl get pod -w # 动态监控pod停启状态,是k8s命令
4.4 滚动更新
# 已ymal方式查看deployme
kubectl get deployment my-dep -oyaml
# 滚动更新
kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record
4.5 版本回退
#历史记录
kubectl rollout history deployment/my-dep
#[root@kubadmin-k8s-master ~]# kubectl rollout history deployment my-dep
#deployment.apps/my-dep
#REVISION CHANGE-CAUSE
#1 <none>
#2 kubectl set image deployment/my-dep nginx=nginx:1.16.1 --record=true
#查看某个历史详情
kubectl rollout history deployment/my-dep --revision=2
#回滚(回到上次)
kubectl rollout undo deployment/my-dep
#回滚(回到指定版本)
kubectl rollout undo deployment/my-dep --to-revision=2
更多: 除了Deployment,k8s还有 StatefulSet 、DaemonSet 、Job 等 类型资源。我们都称为 工作负载。 有状态应用使用 StatefulSet 部署,无状态应用使用 Deployment 部署 https://kubernetes.io/zh/docs/concepts/workloads/controllers/
5 Service
将一组 Pods 公开为网络服务的抽象方法。
5.1 ClusterIP方式
#暴露Deploy
kubectl expose deployment my-dep --port=8000 --target-port=80
# 该命令问clusterIp 模式的service,等同于如下命令
kubecet expose deployment my-dep --port=8000 --target-port=80 --type=ClusterIP
# 查看service
kubectl get service
#NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
#kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8h
#my-dep ClusterIP 10.96.163.204 <none> 8000/TCP 8s
# service的这个ip也只在集群内有效
#查看pod标签
kubectl get pod --show-labels
#NAME READY STATUS RESTARTS AGE LABELS
#my-dep-5b7868d854-9wxz4 1/1 Running 0 11m app=my-dep,pod-template-hash=5b7868d854
#my-dep-5b7868d854-kzf5l 1/1 Running 0 11m app=my-dep,pod-template-hash=5b7868d854
#my-dep-5b7868d854-rftj2 1/1 Running 0 11m app=my-dep,pod-template-hash=5b7868d854
#使用标签检索Pod
#生成service之后,可以通过serviceip:port方式(集群内服务器或pod内部)或者使用域名:port(只能在pod内)的方式进行访问,其中域名的生成规则为service名称.名称空间.svc,如my-dep.default.svc
# 访问方式
curl 10.96.163.204:8000
curl my-dep.default.svc:8000 #只能在pod内
# 使用标签检索Pod
kubectl get pod -l app=my-dep
#NAME READY STATUS RESTARTS AGE
#my-dep-5b7868d854-9wxz4 1/1 Running 0 31m
#my-dep-5b7868d854-kzf5l 1/1 Running 0 31m
#my-dep-5b7868d854-rftj2 1/1 Running 0 31m
生成service之后,可以通过serviceip:port方式(集群内服务器或pod内部)或者使用域名:port(只能在pod内)的方式进行访问,其中域名的生成规则为service名称.名称空间.svc,如my-dep.default.svc
apiVersion: v1
kind