k8s学习
kubectl get pod -A #可以查看所有命名空间pod
kubectl get ns #可以查看所有命名空间namespace
每个 Pod 必须属于且仅属于一个 Namespace
Namespace 是 Pod 的 "作用域"用来隔离
- 你执行
kubectl get pod不加参数,只看default楼层的小组- 加
-n kube-system,才看kube-system这个 "运维部专用楼层" 的小组- 加
-A,就是查看整栋大楼所有楼层的所有小组
创建namespace的两种方式
一,直接create
· kubectl create namespace tuling
二,yaml方式
yaml格式——:后必须有一个空格,下一级必须空两格
apiVersion: v1
kind: Namespace
metadata:
name: ljh
然后apply进行创建
kubectl apply -f ns.yaml
删除namespace
kubectl delete namespace ljh
pod

pod 里面可以有一个或多个容器
运行一个pod
kubectl run mynginx --image=nginx:1.14.2 -n ljh
pod名 指定镜像 指定ns
排错技巧
万一哪个没起来或者什么报错
可以用kubectl describe排错
例如:kubectl describe pod mynginx -n ljh #-n没有就不用
kubectl logs <pod-name>
kubectl get pod name -owide查看详情
[root@k8s-master ~]# kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mynginx 1/1 Running 0 27m 10.244.113.129 k8s-node <none> <none>
这个网段10.244.0.0是在初始化master节点时就设定的了

检查这个ready是否为1/1,0/1的话很可能是网卡选错了
编辑配置文件
kubectl edit daemonset calico-node -n kube-system
在env部分添加
- name: IP_AUTODETECTION_METHOD
value: "interface=ens33" #设为自己的内网网卡
#yaml创建pod
apiVersion: v1 # Pod的API版本,固定写法
kind: Pod # 资源类型,这里是创建Pod
metadata:
labels:
run: mynginx # Pod的标签,用来被Service筛选
name: mynginx # Pod的名称
spec:
containers:
- name: nginx # 容器名
image: nginx # 用的镜像,这里是最新版nginx
ports:
- containerPort: 80 # 声明容器暴露80端口(之前kubectl run没加这个,现在补上了)
如果是一个pod含多个容器
apiVersion: v1
kind: Pod
metadata:
labels:
run: mynginx
name: mynginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
- image: tomcat:9.0.55
name: tomcat
#name和image的顺序有要求吗?完全没有要求! 谁在前谁在后都可以,YAML 不关心对象里键的顺序,只要缩进对就行。
进入pod容器内
kubectl exec -it mynginx -c tomcat -- sh
#deployment

用deployment创建pod
kubectl create deployment my-tomcat --image=tomcat:9.0.55

用了deployment后再删除pod会立刻又拉取一个pod

如果是要真的删除的话
kubectl delete deployment my-tomcat
多副本
kubectl create deployment my-tomcat --image=tomcat:9.0.55 --replicas=3
#一次创建三个

#yaml形式创建deployment
apiVersion: apps/v1 # Deployment的稳定API版本,固定写法
kind: Deployment # 资源类型:声明这是一个Deployment
metadata: # 元数据:资源的基本身份信息
labels: # 给Deployment本身打标签,方便后续筛选查询
app: my-tomcat # 标签键值对:标识这个Deployment属于my-tomcat
name: my-tomcat # Deployment的名称,后续所有操作都用这个名字
spec: # 核心规格:定义Deployment的具体行为
replicas: 3 # 副本数:要求集群中永远保持3个相同的Pod在运行
selector: # 筛选器:告诉Deployment要管理哪些Pod
matchLabels: # 按标签匹配Pod
app: my-tomcat # 只管理带【app=my-tomcat】标签的Pod
template: # Pod模板:Deployment按这个模板批量创建Pod
metadata: # Pod的元数据
labels: # 给创建出来的Pod打标签
app: my-tomcat # Pod的标签,必须和上面selector的标签完全一致
spec: # Pod的核心规格
containers: # Pod内的容器列表(一个Pod可以跑多个容器)
- image: tomcat:9.0.55 # 容器使用的镜像,指定版本9.0.55
name: tomcat # 容器的名称,在Pod内唯一,方便看日志/进容器排障
#扩容与缩容
# 扩容到5个Pod
kubectl scale --replicas=5 deployment my-tomcat# 缩容到3个Pod
kubectl scale --replicas=3 deployment my-tomcat
#升级回滚
升级
kubectl set image deployment my-tomcat tomcat=tomcat:10.1.11 --record
查看历史版本
kubectl rollout history deploy my-tomcat
回滚
kubectl rollout undo deployment my-tomcat
#暴露端口-在已有的pod中(service)
kubectl expose deployment my-tomcat --name=tomcat --port=8080 --type=NodePort
#my-tomcat= 要暴露的 Deployment 名字
kubectl get svc -owide #查看service端口ip——不搞service的话浏览器访问不了
#yaml格式——app: my-tomcat(deployment名)

label:是打标签
selector:才是 **“找目标” 的规则 **:它会在集群里,找到所有带有
app: my-tomcat标签的 Pod,然后把流量转发给它们。

#target:我们想要暴露的端口
#nodeport:对外暴露能访问的端口
#port:server内部访问端口
#挂载nfs,先在所以节点安装nfs
# 1. 所有节点(master/node)都要执行:安装 NFS 客户端工具
yum install -y nfs-utils
# 2. 在 master 节点配置共享目录权限
echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports
# 3. 创建共享目录
mkdir -p /nfs/data
# 4. 启用并启动 rpcbind 和 nfs-server 服务
systemctl enable rpcbind
systemctl enable nfs-server
systemctl start rpcbind
systemctl start nfs-server
# 5. 使配置生效
exportfs -r
#node节点的nfs挂载
mkdir -p /nfs/data
mount -t nfs masterip:/nfs/data /nfs/data
#nginx-pv.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-pv-demo
name: nginx-pv-demo
spec:
replicas: 2
selector:
matchLabels:
app: nginx-pv-demo
template:
metadata:
labels:
app: nginx-pv-demo
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: html
nfs:
server: 192.168.11.101 # 替换为你的 NFS 服务器 IP(master 节点 IP)
path: /nfs/data/nginx-pv#缺点需要知道ip地址,还有删除pod时会保留不可自主决定去留
#pv挂载要管理员先创有pv.yaml(静态供应)
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv01-10m
spec:
capacity:
storage: 10M # 声明这个卷的容量为 10MB
accessModes:
- ReadWriteMany # 支持多节点同时读写
storageClassName: nfs # 存储类,和 PVC 对应
nfs:
path: /nfs/data/01 # NFS 服务器上的目录
server: 192.168.11.101 # NFS 服务器 IP
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv02-1gi
spec:
capacity:
storage: 1Gi # 声明这个卷的容量为 1GB
accessModes:
- ReadWriteMany
storageClassName: nfs
nfs:
path: /nfs/data/02
server: 192.168.11.101---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv03-3gi # 注意:你截图里写的是 py03-3gi,应该是笔误,标准写法是 pv03-3gi
spec:
capacity:
storage: 3Gi # 声明卷容量为 3GB
accessModes:
- ReadWriteMany # 允许多个节点同时读写
storageClassName: nfs # 存储类,和 PVC 绑定匹配用
nfs:
path: /nfs/data/03 # NFS 服务器上的共享目录
server: 192.168.11.101 # NFS 服务器 IP(master 节点)
#pvc.yaml创建一个存储空间(pvc申请一般是自己写)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nginx-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 200Mi
storageClassName: nfs
#最后创建pod(也是自己写)
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-deploy-pvc
name: nginx-deploy-pvc
spec:
replicas: 2
selector:
matchLabels:
app: nginx-deploy-pvc
template:
metadata:
labels:
app: nginx-deploy-pvc
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html # 挂载到Nginx网页目录
volumes:
- name: html
persistentVolumeClaim:
claimName: nginx-pvc # 绑定你之前创建的PVC
缺点容易资源浪费
#动态供应nfs-storage.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-storage
annotations:
storageclass.kubernetes.io/is-default-class: "false" #决定是不是作为默认的
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
parameters:
archiveOnDelete: "true"---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nfs-client-provisioner
labels:
app: nfs-client-provisioner
namespace: default
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: nfs-client-provisioner
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccountName: nfs-client-provisioner
containers:
- name: nfs-client-provisioner
image: registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/nfs-subdir-external-provisioner:v4.0.2
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: k8s-sigs.io/nfs-subdir-external-provisioner
- name: NFS_SERVER
value: 192.168.255.30
- name: NFS_PATH
value: /nfs/data
volumes:
- name: nfs-client-root
nfs:
server: 192.168.255.30
path: /nfs/data---
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-client-provisioner
namespace: default---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: nfs-client-provisioner-runner
rules:
- apiGroups: [""]
resources: ["nodes"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["events"]
verbs: ["create", "update", "patch"]---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: run-nfs-client-provisioner
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
namespace: default
roleRef:
kind: ClusterRole
name: nfs-client-provisioner-runner
apiGroup: rbac.authorization.k8s.io---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: leader-locking-nfs-client-provisioner
namespace: default
rules:
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["get", "list", "watch", "create", "update", "patch"]---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: leader-locking-nfs-client-provisioner
namespace: default
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
namespace: default
roleRef:
kind: Role
name: leader-locking-nfs-client-provisioner
apiGroup: rbac.authorization.k8s.io
#创建pvc
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nginx-pvc02
spec:
storageClassName: nfs-storage
accessModes:
- ReadWriteMany
resources:
requests:
storage: 200Mi

#需要多少就分配多少
ConfigMap用来存储非敏感信息

#创建pod时 创建configmap
apiVersion: v1
kind: Pod
metadata:
name: redis
spec:
containers:
- name: redis
image: redis
command:
- redis-server
- "/redis-master/redis.conf" # 指的是redis容器内部的位置
ports:
- containerPort: 6379
volumeMounts:
- mountPath: /data
name: data
- mountPath: /redis-master
name: config
volumes:
- name: data
emptyDir: {}
- name: config
configMap:
name: redis-conf
items:
- key: redis.conf
path: redis.conf
#如果要改configmap内容
kubectl edit cm redis-conf
#创建一个阿里云仓库的secret
kubectl create secret docker-registry myregistrykey \
--docker-server=registry.cn-hangzhou.aliyuncs.com \
--docker-username=你的阿里云用户名 \
--docker-password=你的阿里云密码 \
--docker-email=你的邮箱
#拉取阿里云仓库镜像创pod
apiVersion: v1
kind: Pod
metadata:
name: redis1
spec:
containers:
- name: redis
image: crpi-cz1mig0dgcoo0245.cn-hangzhou.personal.cr.aliyuncs.com/ljh1234/ljh1234:redis-v1
imagePullSecrets:
- name: regcred #serect名字来获取login阿里云账号密码
#ingress

下载ingress
curl -C - -LO https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.47.0/deploy/static/provider/cloud/deploy.yaml
#下载好后进入deploy.yaml文件修改镜像地址(改成国内的)
找到这行image: k8s.gcr.io/ingress-nginx/controller:v0.46.0@sha256:52f0058bed0a17ab0fb35628ba97e8d52b5d32299fbc03cc0f6c7b9ff036b61a
#改成:registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/ingress-nginx-controller:v0.46.0
通过命令查看
kubectl get pod -n ingress-nginx -owide
kubectl get svc -n ingress-nginx
#注意ingress-nginx-controller这行 右边一定要是NodePort
#可以进入命令进行修改
kubectl edit svc -n ingress-nginx ingress-nginx-controller
可以注意的两处修改
· externalTrafficPolicy: Cluster #如果是local的话是只能是control所在节点ip才能访问
改成Cluster是集群所以节点都可以
· type: NodePort
但没配置策略浏览器访问不到资源

配置规则转发tomcat-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
annotations:
nginx.ingress.kubernetes.io/limit-rps: "1"
spec:
ingressClassName: nginx
rules:
- host: tomcat.tuling.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: tomcat
port:
number: 8080
apply后,kubectl get ing查看

再来访问

#这样就已经实现了资源转发通过ingress转发到service,访问ingress的端口即跟访问service的一样

面试题:
master与个节点之间的通信:通过apiserver
master怎么控制pod调度到哪个节点:调度器scheduler
示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat
spec:
replicas: 1
selector:
matchLabels:
app: tomcat
template:
metadata:
labels:
app: tomcat
spec:
nodeName: k8s-node1 # 直接写节点名
containers:
- name: tomcat
image: tomcat:8
ports:
- containerPort: 8080
#pod的信息都是统一维护到哪里:etcd(数据存储中心)
#pod如何动态缩容扩容(调整副本数):kubectl scale deployment tomcat --replicas=3
#创建deploy形式的两个server,每个server里有两个pod,并由ingress管理两个server
#ing-ser.yaml——创建deploy和server
#ing-ljh.yaml——创建ingress规则
#ing-ser.yaml:
# server-a
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: server-a
name: server-a
spec:
replicas: 2
selector:
matchLabels:
app: server-a
template:
metadata:
labels:
app: server-a
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
labels:
app: server-a
name: server-a
spec:
selector:
app: server-a
ports:
- port: 8000
protocol: TCP
targetPort: 80
---
# server-b
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: server-b
name: server-b
spec:
replicas: 2
selector:
matchLabels:
app: server-b
template:
metadata:
labels:
app: server-b
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
labels:
app: server-b
name: server-b
spec:
selector:
app: server-b
ports:
- port: 8000
protocol: TCP
targetPort: 80
#ing-ljh.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ljh-ingress
annotations:
nginx.ingress.kubernetes.io/limit-rps: "1"
spec:
ingressClassName: nginx
rules:
- host: hello.ljh.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: server-a
port:
number: 80- host: demo.ljh.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: server-b
port:
number: 80

#补充知识点当path是/nginx时,如果浏览器只是访问demo.ljh.com:30460结果如下图
因为规则是只把demo.ljh.com:30460/nginx/下的交到server-b 所以不加/nginx/是找不到东西的,而上面根本没到server层还只是在ingress层
加了之后才能看到这个版本号才是server里的pod里的nginx版本号
#还有一种rewrite功能,表面输入ip:30460/nginx/abc——>ip:30460/abc
#实现方法
1.在metadata处加上图片所示
2.在path处加上
#还想要ingress-nginx其他功能可以访问自行搜索
https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/
#kubesphere
更多推荐







所有评论(0)