首先确保k8s的部署成功!
kubectl get pod -n kube-system
运行镜像:myapp:v1,并查看节点信息!
kubectl run nginx --image=myapp:v1
kubectl get pod
kubectl describe pod nginx
我们还可以查看pod 的附加信息!
可以看到比kubectl get pod
多了IP,NODE,NOMINATED NODE信息!
kubectl get pod -o wide
我们还可以在系统的目录下查看到分配的网络信息!
cd /var/run/flannel/
cat subnet.env
当然在server3,4上都可以看到!
测试:
访问pod生成的ip地址,我们可以看到myapp:v1的信息!
curl 10.244.1.2
kubectl delete pod nginx
kubectl get pod
创建两个后端的容器,并访问生成的ip地址
kubectl create deployment demo --image=myapp:v1 --replicas=2
kubectl get pod -o wide
curl 10.244.1.3
查看标签,查看所有结点的信息
可以看到标签app=demo!!
kubectl get pod --show-labels
kubectl get all
若是删除pod节点中的任何一个,都会自动生成一个!如下图
kubectl get pod
kubectl delete pod demo-5b4fc8bb88-g8r58
kubectl get pod
将指定端口80暴露,使得外部可以访问:
kubectl expose deployment demo --port=80 --target-port=80
kubectl get all
可以看到生成了cluster ip如图的IP
访问这个IP,可以看到已经负载均衡了
curl 10.98.122.128/hostname.html
可以查看svc节点信息.
后端节点Endpoints:必须能看到生成的IP地址才能访问成功!
kubectl describe svc demo
但是我们kubectl get pod -o wide
可以看到都是运行在server4上的!
我们将其中一个节点删掉,它会自动运行在server3上,如下图:
kubectl get pod -o wide
kubectl delete pod demo-5**********
kubectl get pod -o wide
当然看svc节点信息,后端节点Endpoints的IP也会发生变化!
kubectl describe svc demo
只要查看pod信息,节点信息都是running而且都是ready即表示成功!
kubectl get pod
kubectl scale deployment demo --replicas=6
kubectl get pod
我们可以看到现在的pod已经变成了6个节点!
查看svc节点信息,可以看到endpoints的IP地址也变为了6个!
kubectl describe svc demo
kubectl scale deployment demo --replicas=2
kubectl get pod
kubectl get pod -o wide
我们刚才使用的镜像是myapp:v1,如果我们需要更新镜像为myapp:v2就可以如下操作:
kubectl set image deployment demo myapp=myapp:v2
kubectl get pod
我们可以看到kubectl get pod
查看的时候,出现了terminationg状态,表示正在替换中,过一会就好了!
访问更新之后的IP
curl 10.244.1.7
更新后以前的rs不会消失,为了回滚更新!
kubectl get all
我们可以查看版本迭代的历史信息:
kubectl rollout history deployment demo
将版本返回第一个版本!
kubectl rollout undo deployment demo --to-revision=1
kubectl get pod -o wide
curl 10.244.27
回滚之前是下图所示,说明版本更新和回退会在这两个rs中变化!
在我们的日常工作中,可能要重复简历或者对pod节点进行操作,如果一直使用命令行来实现的话是不高效的工作方法。
资源清单就好比shell脚本一样,会按照你的清单执行命令,相比较命令行更加方便,也易于修改。
书写时候的查找方法,可以之直接通过explain一步一步查找参数内容用法
[root@server2 ~]# kubectl explain pod ##查看pod所有参数,-required-带有required是必须存在的参数
直接打开一个已经有的deployment,然后生成相应的yaml文件
[root@server2 ~]# kubectl run demo --image=myapp:v1
[root@server2 ~]# kubectl get pod
[root@server2 ~]# kubectl get pod demo
[root@server2 ~]# kubectl get pod demo -o yaml ##生成一个yaml文件
编辑清单,文件格式为.yaml
创建名为pod-example的pod,选取镜像为myapp:v1
cd
mkdir pod
cd pod/
vim pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
containers:
- name: myapp
image: myapp:v1
kubectl apply -f pod.yaml
kubectl get pod
在sesrver1:
将busyboxplus镜像上传私有仓库:
docker tag busyboxplus:latest reg.westos.org/library/busyboxplus:latest
docker push reg.westos.org/library/busyboxplus:latest
[root@server2 ~]# kubectl delete -f pod.yml
使用资源清单创建一个pod节点,包含myapp容器和busyboxplus容器为其分配伪终端
cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
containers:
- name: myapp
image: myapp:v1
- name: busybox
image: busyboxplus:latest
tty: true
stdin: true
kubectl apply -f pod.yaml
kubectl get pod
pod-example中有两个容器处于READY状态。
进入busybox终端,-c指定容器 -i打开输入端口 -t打开伪终端
终端内访问localhost
kubectl attach pod-example -c busybox -i -t
ip addr
curl localhost
退出后可继续进入,pod节点会重启。
ctrl+d退出终端,但是再次查看可以看到还是running状态
kubectl get pod
删除pod.yaml节点
kubectl delete -f pod.yaml
默认值,IfNotPresent:本地有则使用本地镜像,不拉取
vim pod.yaml
imagePullPolicy: IfNotPresent
可以看到详细信息:直接创建,开启容器,没有拉取动作!
kubectl describe pod pod-example
再次删除,重新修改文件内容:
指定容器所在主机需要监听的端口号,设置了hostPort同一台主机无法启动该容器的相同副本,因为主机的端口号不能相同,只会写到iptables中
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
containers:
- name: myapp
image: myapp:v1
ports:
- containerPort: 80
hostPort: 80
运行清单
可以看到分配到了server3上,访问server3
kubectl apply -f pod.yaml
kubectl get pod -o wide
在server3上查看端口netstat -antlp没有80!
但是在路由策略里面有80!!
netstat -antlp
iptables -t nat -nL |grep :80
将前面的pod删掉修改文件:
kubectl delete pod.yaml
锁定为与主机共用ip:
hostNetwork: true
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
hostNetwork: true #直接锁定为与主机共用ip
containers:
- name: myapp
image: myapp:v1
kubectl apply -f pod.yaml
kubectl get pod -o wide #查看podip
删除pod节点修改文件:
限制内存和cpu使用量,requests为最低限制,limit为最高限制
apiVersion: v1
kind: Pod
metadata:
name: pod-example
spec:
#hostNetwork: true
#nodeName: server4
#imagePullSecrets:
containers:
- name: myapp
image: myapp:v1
imagePullPolicy: IfNotPresent
resources:
requests:
cpu: "100m"
memory: "50Mi"
limits:
cpu: "200m"
memory: "100Mi"
kubectl apply -f pod.yaml
kubectl describe pod pod-example
前面我们说了,容器推出后,会自动重新!
我们现在加上参数–restart=Never实现退出后不重启
kubectl run -it busybox --image=busyboxplus --restart=Never
ip addr
退出
kubectl get pod
使用后退出,该节点显示已完成,且不会自动重启
状态处于0/1!!
不加参数就会重新启动容器:
删除刚才的容器busybox!重新创建容器,不加参数!
kubectl delete pod busybox
kubectl run -i -t busybox --image=busyboxplus
ip addr
kubectl get pod
删除busybox容器,删除pod节点
查看标签!
kubectl delete pod busbox
kubectl delete -f pod,yaml
kubectl get node --show-labels
锁定pod节点在server4上!
#hostNetwork: true
nodeName: server4 #锁定pod节点
kubectl apply -f pod.yaml
kubectl get pod -o wide
若是指定下载的仓库不是公开的就会报错!
我们先删除pod节点,重新修改文件:
image: westos/game2048:latest
接着执行清单
kubectl apply -f pod.yaml
kubectl describe pod pod-example
删除pod节点
Pod中可以包含多个容器。
在容器环境初始化完成之后,pod也可以有一个或多个先于容器启动的Init初始化容器。初始化容器之后,容器运行。
编写初始化文件
cd pod
vim init.yaml
内容如下:
vim init.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busyboxplus
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busyboxplus
command: ['sh', '-c', "until nslookup myservice.default.svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
- name: init-mydb
image: busyboxplus
command: ['sh', '-c', "until nslookup mydb.default.svc.cluster.local; do echo waiting for mydb; sleep 2; done"]
---
apiVersion: v1
kind: Service
metadata:
name: myservice
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9376
执行初始化文件,删除svc中的demo
因为初始化需要时间,所以不会很快完成,需要等待!
kubectl get svc
kubectl delete svc demo
kubectl apply -f init.yaml
我们在初始化文件中再多添加一个服务
---
apiVersion: v1
kind: Service
metadata:
name: mydb
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9377
kubectl get pod -w 可以查看执行的动态过程!
我这里有busbox,删掉它,因为没有用!
1/1表示初始化成功!
kubectl get pod
kubectl get pod -w
kubectl get pod
删除初始化:
kubectl delete -f init.yaml
livenessProbe:存活探针,指示容器是否正在运行。如果为运行会杀掉失败进程,受到重启策略影响重新拉起容器进行检测。默认开启。
readinessProbe:就绪探针,指示容器是否准备好服务请求。
startupProbe: 指示容器中的应用是否已经启动。
将文件前面修改的imgae镜像改回来!
vim pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-example
labels: ###添加标签!
app: myapp
spec:
containers:
- name: myapp
image: myapp:v1
imagePullPolicy: IfNotPresent
resources:
requests:
cpu: "100m"
memory: "50Mi"
limits:
cpu: "200m"
memory: "100Mi"
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 1
periodSeconds: 3
timeoutSeconds: 1
kubectl apply -f pod.yaml
kubectl get pod
kubectl describe pod pod-example
删除pod节点,修改文件,加入就绪探针
vim pod.yaml
readinessProbe:
httpGet:
path: /test.html
port: 80
initialDelaySeconds: 1
periodSeconds: 3
timeoutSeconds: 1
kubectl get pod -o wide
curl 10.244.1.16
添加标签,通过标签将svc和pod联系起来,供外网访问。
vim svc.yaml
apiVersion: v1
kind: Service
metadata:
name: mysvc
spec:
ports:
- protocol: TCP
port: 80
targetPort: 80
执行svc.yaml清单,并查看mysvc的状态
kubectl apply -f svc.yaml
kubectl get svc
kubectl describe svc mysvc
因为pod.yaml指定了文件为test.html
容器的nginx中没有test.html
进入容器,添加测试页
kubectl exec pod-example -i -t -- sh
cd /usr/share/nginx/html/
echo www.westos.org > test.html
添加测试页之后。很快pod-example已READY状态!
查看状态并访问IP
kubectl get pod -w
kubectl get pod -o wide
curl 10.244.1.17/test.html
此时查看mysvc的详细信息,可以看到endpoints也出现了ip地址!
kubectl describe svc mysvc
当把nginx下的文件test.html删除掉之后,立马状态小时,且endpoints也不存在IP了!如下图::
rs控制器:控制副本,确定任何时间都有指定数量的Pod副本在运行,根据标签匹配。
cd pod
vim rs.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: replicaset-example
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
执行清单rs.yaml
kubectl apply -f rs.yaml
kubectl get pod
将前面实验的pod-example节点删除掉
查看扩展信息和rs信息
kubectl delete pod pod-example
kubectl get pod -o wide
kubectl get rs
kubectl get pod --show-labels
修改节点标签,–overwrite:覆盖节点标签
kubectl label pod replicaset-example-*** app=myapp --overwrite
kubectl get pod --show-labels
删除节点不影响原来的rs控制器建立的容器
下图出现6个节点是因为把rs文件的节点数replicas改为6了!
kubectl delete pod replicaset-example-****
kubectl get pod
deployments控制器:用来创建pod和ReplicaSet,依靠标签显示,相比较rs可更新容器,可扩容,可暂停和恢复
cd
cd pod
vim deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: myapp:v1
将前面的rs.yaml删除,执行deployment.yaml
kubectl delete -f rs.yaml
kubectl apply -f deployment.yaml
kubectl get pod
kubectl get all
修改yaml文件,更新容器
节点数增加为6个!
vim deployment.yaml
replicas: 6
和前面不一样,不需要删除deployment.yaml,再次运行清单deployment.yaml就可以更新!
kubectl apply -f deployment.yaml
kubectl get pod
查看标签
kubectl get pod --show-labels
kubectl label pod nginx-deloyment-****** app=myapp --overwrite
kubectl get pod --show-labels
标签已经改变!
删除其中一个节点,也会重新加载出来一个新的!
修改文件deployment.yaml使得版本更新!
kubectl apply -f deployment.yaml
kubectl get pod -o wide
curl 10.244.2.23
kubectl apply -f deployment.yaml
kubectl get pod -o wide
curl 10.244.2.26
kubectl get rs
版本切换结构图示:
vim daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset-example
labels:
k8s-app: nginx
spec:
selector:
matchLabels:
name: nginx
template:
metadata:
labels:
name: nginx
spec:
containers:
- name: nginx
image: nginx
执行清单
kubectl apply -f daemonset.yaml
kun=bectl get pod -o wide
kubectl delete -f daemonset.yaml
vim job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
backoffLimit: 4
在server1上拉取镜像perl.tar,并上传到私有仓库中!
执行清单job.yaml
kubectl apply -f job.yaml
我们可以查看日志:
kubectl logs pi-sd527
写一个定时清单:
vim cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cronjob-example
spec:
schedule: "* * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: cronjob
image: busyboxplus
args:
- /bin/sh
- -c
- date; echo Hello from k8s cluster
restartPolicy: OnFailure
kubectl apply -f cronjob.yaml
kubectl get pod
kubectl logs cronjob-example-****
完成之后,删除cronjob.yaml清单即可!