一
添加pod测试
创建deployment
kubectl create deployment nginx(pod名称)–image=nginx
创建后查看:kubectl get deployment
放开端口
kubectl expose deployment nginx --por=80 type=NodePort
查看服务端口:32079
可以通过集群任一ip地址(master或者node节点)
ip地址:32079访问部署的nginx
deployment扩容pod
该方法比较麻烦,需要手动更新镜像等,查不到更新历史记录
准备war包,和Dockerfile放在同一个目录中
vim Dockerfile
创建镜像
修改镜像tag:docker tag
登录远程镜像仓库:docker login
推送至远程仓库:docker push
k8s运行镜像
kubectl create deployment jpresstest(pod名称)–image=jpress:v1
或者创建yaml文件配置
放开端口32080
kubectl expose deployment jpresstest --por=8080 type=NodePort
或者创建yaml文件配置
kubectl get svc
访问报错
查看pod状态有问题kubectl get pod
进入pod(1个pod只有1个docker容器)
kubectl exec -it jpresstest-9c7c97fbc-lb67 – /bin/bash
进入pod(1个pod有多个docker容器)
kubectl exec -it jpresstest-9c7c97fbc-lb67 --container main-app – /bin/bash
容器中没有对应的文件
更新镜像文件:
先运行镜像docker run -d -p jpress:v1
进入运行镜像创建的容器:docker exec -it 容器id /bin/bash
调整好容器内部的内容
退出该容器内部
提交该容器:docker commit 容器id jpress:v2
提交后修改该容器tag并提交至阿里云仓库,版本记录为v2
滚动更新k8s集群的pod版本:kubectl set image deploy/
查看k8版本
kubectl api-versions
v1:Kubernetes API的稳定版本,包含很多核心对象:pod、service等
apps/v1:在kubernetes1.9版本中,引入apps/v1,deployment等资源从extensions/v1beta1, apps/v1beta1 和 apps/v1beta2迁入apps/v1,原来的v1beta1等被废弃。
apps/v1代表:包含一些通用的应用层的api组合,如:Deployments, RollingUpdates, and ReplicaSets
pod的生命周期短暂,会被频繁的创建和销毁。当pod被销毁时,pod内的文件系统也会被销毁,所以为了解决这个问题,k8s提供了Volume。
Volume的生命周期独立于pod容器。当pod不在存在时,k8s会销毁临时卷。但对于持久卷,k8s在pod重启期间不会进行销毁
持久卷的核心是一个目录,任何pod的容器都可以访问该目录中的数据。
nfs作用:
多节点共享存储
独立于pod的文件服务器
文件服务器搭建
nfs搭建(分服务端和客户端):
三台主机:master node1 node2
搭建在node2主机。
centos7只安装nfs-utils
yum -y install nfs-utils rpcbind
随意找个路径放置nfs存储路径
mkdir /home/nfs/
编辑/etc/exports文件添加需要共享目录,每个目录的设置独占一行,编写
/usr/local/nfs 192.168.0.0/16(rw,sync)
同192.168.248.0/24一个网络号的主机可以挂载NFS服务器上的/home/nfs/目录到自己的文件系统中
rw表示可读写;sync表示同步写,fsid=0表示将/data找个目录包装成根目录
no_root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员(不常用)
all_squash 无论NFS客户端使用什么账户访问,均映射为NFS服务器的匿名用户(常用)
sync 同时将数据写入到内存与硬盘中,保证不丢失数据
async 优先将数据保存到内存,然后再写入硬盘;这样效率更高,但可能会丢失数据
设置共享目录生效
exportfs -r
启动nfs
systemctl start rpcbind.service
systemctl enable rpcbind.service
systemctl start nfs.service
systemctl enable nfs.service
确认NFS服务器启动成功:
rpcinfo -p
检查 NFS 服务器是否挂载我们想共享的目录 usr/local/nfs:
exportfs
检查nfs服务是否能正常访问
showmount -e node2ip地址
-e:显示NFS服务器上所有的共享目录
启动客户端rpcbind.service nfs
node2节点挂在目录报错(第一次成功没有报错,之后再执行就报错):
挂载:
mount -t nfs 192.168.126.8:/usr/local/nfs /root/nfs
卸载
umount /root/nfs
开机自动挂载
写入/etc/fstab
mount -a
df -h 执行(node2节点)是已经挂载成功了
测试挂载:
客户端添加u.txt 文件夹,可以再服务端(node1)节点看到
创建yaml文件
kind: Deployment
apiVersion: apps/v1
metadata:
labels:
app: wework-tomcat-app1-deployment-label
name: wework-tomcat-app1-deployment --Deployment名称(由 .metadata.name 字段标明)
namespace: wework --所属namespace
spec:
replicas: 3 --创建三个(由 replicas 字段标明)Pod 副本
selector:
matchLabels:
app: wework-tomcat-app1-selector --selector 字段定义 Deployment 如何查找要管理的 Pods。 在这里,你选择在 Pod 模板中定义的标签(app: wework-tomcat-app1-selector), 在 API 版本 apps/v1 中,Deployment 标签选择算符在创建后是不可变的。
template:
metadata:
labels:
app: wework-tomcat-app1-selector --Pod 被使用 labels 字段打上 app: nginx 标签。
spec:
containers:
- name: wework-tomcat-app1-container
image: jpress:v3
ports: ---容器内端口
- containerPort: 8080
protocol: TCP
name: http
volumeMounts: ----容器内挂载点
- name: wework-images --必须有名字
mountPath: /usr/local/tomcat
readOnly: false
volumes:
- name: wework-images ---跟上边名称一致
nfs: ---宿主机挂载点
server: 192.168.126.8
path: /usr/local/nfs
---
kind: Service
apiVersion: v1
metadata:
labels:
app: wework-tomcat-app1-service-label
name: wework-tomcat-app1-service
namespace: wework
spec:
type: NodePort
ports:
- name: http
port: 8080
protocol: TCP
targetPort: 8080
nodePort: 30095
selector:
app: wework-app1-selector
编写完成后保存退出
应用该文件:kubectl apply -f wework.yaml
也可以查到对应的pod 和deployment
会提示没有对应的catalina.sh
不知道为什么,pod刚运行起来没有在对应的共享目录中共享数据。
解决方法:将tomcat安装包解压后复制进共享目录,
pod就可以正常运行了(以下是将副本数量设置为1了,好处理)
进入pod副本:kubectl exec -it podID /bin/bash
随意创建文件,可以在nfs服务端的共享目录看到
创建一个test.txt 文件测试,即使将pod删除后重新运行也依旧存在test.txt
实现镜像同步
注:
以下镜像名可以修改,如果修改为从阿里云pull的镜像(registry.cn-hangzhou.aliyuncs.com/mynamespacew/jpress:v3)
可以修改vi /etc/docker/daemon.json //如果没有此文件,请创建
添加代码
“insecure-registries”:[“htts://registry.cn-hangzhou.aliyuncs.com/mynamespacew”]
新建pod,查看pod状态异常
查看pod日志:kubectl logs pod实例 -n 命名空间
kubectl describe pod pod实例名称 -n 命名空间
进入pod和容器提示
查看pod节点:kubectl describe pod jpresstest-9c7c97fbc-vpwnt
报错如下:back-off pulling image ‘jpress:v1’
经查,node节点没有该镜像
该pod所属node1节点,在该节点下pull该镜像
master节点重新获取pod正常
另外一个同理。
查看节点状态是否正常:kubectl get nodes
查看有问题的节点:kubectl get nodes node2
kubelet stopped posting node status .说明是kubelet的问题。
确认node2节点的kubelet状态,状态正常
查看运行日志:Journalctl -u kubelet
重启kubelet后正常:systemctl restart kubelet
K8S 不能直接删除Pod,直接删除Pod,会被Deployment重启
先删除deployment.
1.查看deployment
查看pod
2删除deployment:kubectl delete deployment nginx
查看deployment
3删除服务
kubectl delete src nginx
kubectl get src
4
状态为terminating的无法删除
可以强制删除:kubectl delete pod pod-name -n ns-name --force --grace-period=0
再查看就没有对应的pod了
注:
如果强制删除还不行,设置finalizers为空
(如果一个容器已经在运行,这时需要对一些容器属性进行修改,又不想删除容器,或不方便通过replace的方式进行更新。kubernetes还提供了一种在容器运行时,直接对容器进行修改的方式,就是patch命令。)
kubectl patch pod xxx -n xxx -p ‘{“metadata”:{“finalizers”:null}}’
1
查看节点的标签
kubectl describe ns test | grep “Labels” -A 10
2
查看服务器节点
kubectl get nodes
3
节点打标签
kubectl label nodes <节点名称> labelName=<标签名称>
例:kubectl label nodes node2 labelName=test
kubectl get node --show-labels
4
删除节点标签
kubectl label node node2 labelName-
5
查看所有pod节点
kubectl get pod -A
6
查看对应节点的所属IP地址
kubectl get pod -o wide -n kube-system
查看所有节点的所属IP地址
kubectl get pod -o wide -A
7
根据yaml文件创建pod
kubectl apply -f yaml文件
根据yaml文件删除pod
kubectl delete -f yaml文件
8
创建命名空间test:
kubectl create ns test
为命名空间test设置标签ev=test:
kubectl label ns test env=test
修改命名空间标签
kubectl label --overwrite ns test env=testtest
删除命名空间标签
kubectl label ns test env-
9
扩容/缩容
kubectl scale deploy/
10
暂停deployment,被 pause 命令暂停的资源不会被控制器协调使用
kubectl rollout pause deployment deploy名称 -n 命名空间
启动deployment
kubectl rollout resume deployment deploy名称 -n 命名空间
11
进入pod和容器
kubectl exec -it 容器id -n 命名空间名称
12
查看历史更新:kubectl roullout history deploy/deployment -n 命名空间
13
回退pod到上一个版本:kubectl roullout undo deploy/wework-deployment -n wework
回退pod到上一个版本也会记录在更新历史中。
error converting YAML to JSON: yaml: line 3: mapping values are not allowed in this context
这个问题是因为yaml文件不支持tab制表符
yaml语法不支持制表符,用空格代替就行。