apiVersion: apps/v1
kind: Deployment
metadata:
name: test
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
- name: tomcat
image: tomcat
监控启动容器
[root@k8s-master-01 ~]
查看容器启动的详情
[root@k8s-master-01 ~]
进入容器
kubectl exec -it test-7566b76cfc-vmtf9 -- bash
指定进入容器
kubectl exec -it test-7566b76cfc-vmtf9 -c tomcat-- bash
查看pod的版本号
kubectl explain pod
查看pod后面跟的spec字段
kubectl explain pod.spec
1.master节点的组件?
scheduler
apiversion
controller-manager
集群DNS
2.测试集群的连接
1.ip a 查看flannel的地址 ping一下
2.kubectl run test -it --rm --image=busybox:1.28.3
3.kubectl get pods -n kube-system
4.kubectl get nodes -o wide
3.pod的生命周期?
4.控制器有哪些?
Deployment:部署无状态的应用,随机调度到各个节点(启动没有先后顺序的,web端)
DaemonSet:在每台节点上只部署一个
StatufluSet:部署有状态的应用
5.什么是service?
用来做负载均衡同时向集群暴露服务,一个service就是一个微服务
6.deployment与pod怎么关联?
通过标签关联。
7.控制器
1、Deployment
部署无状态应用
创建一个deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: test
spec:
selector:
matchLabels:
app: test
template:
metadata:
labels:
app: test
spec:
containers:
- name: nginx
image: nginx
可以通过以下命令慢慢寻找
kubectl explain [资源类型]
命名规范:
1、必须以字母开头
2、只能够包含字母、数字和中划线
3、字母必须小写
2、DaemonSet
在每一台节点上部署一个Pod,一般用来监控、收集日志。
8.service
k8s集群中智能负载均衡器
1、ClusterIP: 向集群内部暴露服务
2、NodePort:通过宿主主机的NodeIP:NodePort来暴露集群内部服务
3、LoadBalancer : 依赖于弹性IP的向集群外部暴露服务的负载均衡器 4、
9.HeadLess Service
HeadLessService实际上是属于ClusterIP
[root@k8s-master-01 ~]
Name: headless-svc
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=wordpress
Type: ClusterIP
IP Families: <none>
IP: None
IPs: None
Port: https 80/TCP
TargetPort: 80/TCP
Endpoints: <none>
Session Affinity: None
Events: <none>
10.Service在创建之前是可以自定义IP的
apiVersion: v1
kind: Service
metadata:
name: service
spec:
selector:
release: stable
ports:
- name: http
port: 80
targetPort: 80
protocol: "TCP"
clusterIP: 10.100.76.88
11.Service跟Pod之间关系
service ---> endpoints ---> pod
[root@k8s-master-01 ~]
NAME ENDPOINTS AGE
headless-svc <none> 16h
kubernetes 192.168.15.31:6443 6d20h
service 10.244.1.28:80,10.244.1.30:80,10.244.1.31:80 + 2 more... 8m51s
test-svc 10.244.1.27:80 10h
[root@k8s-master-01 ~]
Name: service
Namespace: default
Labels: <none>
Annotations: endpoints.kubernetes.io/last-change-trigger-time: 2021-08-25T01:36:59Z
Subsets:
Addresses: 10.244.1.28,10.244.1.30,10.244.1.31,10.244.2.43,10.244.2.46
NotReadyAddresses: <none>
Ports:
Name Port Protocol
---- ---- --------
http 80 TCP
Events: <none>
[root@k8s-master-01 ~]
Name: service
Namespace: default
Labels: <none>
Annotations: <none>
Selector: release=stable
Type: ClusterIP
IP Families: <none>
IP: 10.100.76.88
IPs: 10.100.76.88
Port: http 80/TCP
TargetPort: 80/TCP
Endpoints: 10.244.1.28:80,10.244.1.30:80,10.244.1.31:80 + 2 more...
Session Affinity: None
Events: <none>
12.Ingress的类型
nginx ingress : 性能强
traefik :原生支持k8s
istio : 服务网格,服务流量的治理
13 Ingress Nginx创建wordpress
1、创建HTTPS证书
openssl genrsa -out tls.key 2048
openssl req -new -x509 -key tls.key -out tls.crt -subj /C=CN/ST=ShangHai/L=ShangHai/O=Ingress/CN=www.test.com
2、部署证书
kubectl -n wordpress create secret tls ingress-tls --cert=tls.crt --key=tls.key
3、创建Ingress
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
name: ingress-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
tls:
- secretName: ingress-tls
rules:
- host: www.test.com
http:
paths:
- path: /
backend:
serviceName: wordpress
servicePort: 80
4、查看ingress暴露的443端口
[root@k8s-m-01 ~]
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller NodePort 10.96.25.245 <none> 80:52109/TCP,443:45419/TCP 30m
5、浏览器访问
https://www.test.com:45419/
apiVersion: v1
kind: Namespace
metadata:
name: mysql
---
kind: Service
apiVersion: v1
metadata:
name: mysql
namespace: mysql
spec:
ports:
- name: http
port: 3306
targetPort: 3306
selector:
app: mysql
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: name-mysql
namespace: mysql
spec:
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7.33
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
spec:
replicas: 1
selector:
matchLabels:
app: wordpress
template:
metadata:
labels:
app: wordpress
spec:
containers:
- name: php
image: alvinos/php:wordpress-v2
- name: nginx
image: alvinos/nginx:wordpress-v2
---
apiVersion: v1
kind: Service
metadata:
name: wordpress
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: wordpress
---
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
name: ingress-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
tls:
- secretName: ingress-tls
rules:
- host: www.test.com
http:
paths:
- path: /
backend:
serviceName: wordpress
servicePort: 80
1、监控docker
docker inspect
2、k8s的组件有哪些
kube-apiserver
kube-controler-manager
调度器
kubelet
kube-proxy
DNS
ETCD
Flannel
3、控制器有哪些,以及特点
Deployment
部署无状态应用
DaemonSet
每个节点上都部署一个
StatufluSet
部署有状态应用
4、service的类型有哪些?
1、ClusterIP
一般情况下,用来向集群内部暴露服务
1.1、HeadLess Service(无头Service)
2、NodePort
一般情况下,依赖于宿主主机的IP和端口向集群外部暴露服务
3、LoadBalancer
依赖于弹性IP向集群外部暴露服务
4、ExtennelName
将外部的一个服务定义一个集群内部的别名
Service别名
在mysql名称空间内创建一个WordPress service,请问在default名称空间内怎样访问这个Servier下的pod服务?
xxx.xxx.xxx.xxx
wordpress
wordpress.mysql
service名称.命名空间.svc.cluster.local
5、ingress nginx的工作原理
根据ingress配置清单,实时生成Nginx配置,并且使其生效,之后通过nginx反向代理转发流量到pod中。
6、从ingress到pod的流程
ingress ---> endpoints(HeadLess Service) ---> pod
7、控制器、service以及ingress管理pod的方式是什么?
控制器 ---> 通过标签(labels)
Service ---> endPoints
ingress ---> endpoints
1、ingress 设置重定向的方式有哪些,区别是什么?
1、注解 当前ingress生效
2、configmap 全局生效
2、ingress nginx的原理是什么?
实时将ingress转换成nginx配置,并使其生效。从而使nginx代理pod
3、pod的生命周期是什么?
1、创建pod,并调度到合适的节点上
2、创建pause基础容器,提供共享名称空间
3、串行业务容器容器初始化
4、启动业务容器,启动那一刻会同时运行主容器上定义的Poststart钩子事件
6、持续存活状态监测、就绪状态监测
7、结束时,执行prestop钩子事件
8、终止容器
5、docker网络的四种模式
网桥
none
container
host
6、dockerfile中常用的命令
FROM
RUN
CMD
ONBUILD [指令]
ADD
COPY
EXPOSE
ARG
存储卷
WORKDIR
7、k8s中的组件及其协同关系
apiserver
controller manager
scheduler
集群DNS
kubelet
kube-proxy
Flannel
数据库:ETCD
协同关系:都是通过apiserver进行调度的。每一个操作都要经过apiserver
8、service的四种类型
ClusterIP ------分支(Headless Service)------(Headless Service)使用场景---当不使用集群内部的负载均衡,使用endpoints就可以。
NodePort
LoadBalancer
EnternelName
service怎么关联pod?
service ------endpoints-----pod
endpoints通过标签关联pod
9、k8s存储卷有哪些
emptyDir
hostPath
Pv/PVC
StrogerClass
configmap
secrets
习题
1、service类型
1、ClusterIP
1.1、HeadLess Service
2、NodePort
3、LoadBanlaner
4、ExtenerName
2、健康检查
1、存活性检查
2、就绪性检查
3、两种健康检查的针对点
1、存活性检查 : 容器是否正常启动
2、就绪性检查 : 容器是否能够正常提供服务
4、两种健康检查处理错误的方式
1、存活性检查 : 删除容器
2、就绪性检查 :移出负载均衡
5、k8s组件及其之间的协同关系
调度器通过kubelet获取每一个node节点的信息(磁盘。cpu),然后返回给apiserver,存储到etcd中,调度器通过apiserver到etcd中取数据,经过算法分析应该到那个节点之上。
6、将pod调度到master节点上
1、删除污点
删除master节点上打的污点标签,使用亲和性使pod调度到master(selectNode)
2、容忍污点
设置pod容忍污点,使用selectNode调度到master
7、docker 网络类型
1、网桥
2、host
3、none
4、container
8、k8s存储卷类型
1、emptyDir
2、hostPath
3、pv/pvc
4、strongClass
5、configMap
6、Secrite
9、简单说明一下emptyDir和hostPath
1、emptyDir : 注意用来作为Pod中的临时目录
2、hostPath : 类似于docker -v参数,将存储卷挂载在本地(pod部署的节点上)
10、部署一个WordPress
1、构建镜像
2、构思架构,编写配置清单
3、部署调试
Jenkins(一切尽在k8s中)
作业
连接:https://gitee.com/3dming/DiscuzL/attach_files
要求:
ingress —> headless service —> pod
1、要有健康检查
2、要求有https
3、要求有存储卷(hostpath)
1、下载discuz安装包,并解压,同步到所有节点上
[root@k8s-m-01 /opt/discuz]
2、构思架构,并且编写配置清单(见下文)
3、部署并调试
1、创建HTTPS证书
[root@k8s-m-01 /opt/discuz]
Generating RSA private key, 2048 bit long modulus
.+++
.................................................................................+++
e is 65537 (0x10001)
[root@k8s-m-01 /opt/discuz]
2、部署证书
[root@k8s-m-01 /opt/discuz]
namespace/discuz created
[root@k8s-m-01 /opt/discuz]
secret/discuz-secret created
配置清单
apiVersion: v1
kind: Namespace
metadata:
name: mysql
---
kind: Service
apiVersion: v1
metadata:
name: mysql-svc
namespace: mysql
spec:
ports:
- port: 3306
targetPort: 3306
name: mysql
protocol: TCP
selector:
app: mysql
deploy: discuz
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-deployment
namespace: mysql
spec:
selector:
matchLabels:
app: mysql
deploy: discuz
template:
metadata:
labels:
app: mysql
deploy: discuz
spec:
nodeName: k8s-m-02
containers:
- name: mysql
image: mysql:5.7
livenessProbe:
tcpSocket:
port: 3306
readinessProbe:
tcpSocket:
port: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"
- name: MYSQL_DATABASE
value: "discuz"
volumeMounts:
- mountPath: /var/lib/mysql
name: mysql-data
volumes:
- name: mysql-data
hostPath:
path: /opt/discuz/mysql
---
kind: Namespace
apiVersion: v1
metadata:
name: discuz
---
kind: Service
apiVersion: v1
metadata:
name: discuz-svc
namespace: discuz
spec:
clusterIP: None
ports:
- port: 80
targetPort: 80
name: http
selector:
app: discuz
deploy: discuz
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: discuz-deployment
namespace: discuz
spec:
selector:
matchLabels:
app: discuz
deploy: discuz
template:
metadata:
labels:
app: discuz
deploy: discuz
spec:
containers:
- name: php
image: alvinos/php:wordpress-v2
livenessProbe:
tcpSocket:
port: 9000
readinessProbe:
tcpSocket:
port: 9000
volumeMounts:
- mountPath: /usr/share/nginx/html
name: discuz-data
- name: nginx
image: alvinos/nginx:wordpress-v2
livenessProbe:
httpGet:
port: 80
path: /
readinessProbe:
httpGet:
port: 80
path: /
volumeMounts:
- mountPath: /usr/share/nginx/html
name: discuz-data
volumes:
- name: discuz-data
hostPath:
path: /opt/discuz/upload
---
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
name: discuz-ingress
namespace: discuz
spec:
tls:
- hosts:
- www.discuz.cluster.local.com
secretName: discuz-secret
rules:
- host: www.discuz.cluster.local.com
http:
paths:
- backend:
serviceName: discuz-svc
servicePort: 80
习题
1、k8s存储卷类型有哪些
emptyDir
hostPath
pv/pvc
strogeClass
configMap
secrte
2、存储卷的特点 emptyDir:生成一个空的目录,pod删除随之删除。
- 1.临时文件
- 2.容器之间共享
hostPath:借助于宿主机挂载。类似于docker -v
pv/pvc:利用nfs网络存储
pv:相当于一块小的分区 PVC:定义存储卷的大小
3、service的类型有哪些
4、pod的生命周期
6、控制器的类型及特点
7、你认为k8s排错的方法可以有哪些
kubectl describe pod pod名称 查看错误
1、权限错误
2、内存不足
3、网络
kubectl get pods -n kube-system 看一下集群DNS
[root@k8s-master-01 discuz]
NAME READY STATUS RESTARTS AGE
coredns-f68b4c98f-527gt 1/1 Running 8 9d
coredns-f68b4c98f-hmm8j 1/1 Running 8 9d
etcd-k8s-master-01 1/1 Running 8 9d
kube-apiserver-k8s-master-01 1/1 Running 9 9d
kube-controller-manager-k8s-master-01 1/1 Running 9 9d
kube-flannel-ds-44r9l 1/1 Running 9 9d
kube-flannel-ds-h755r 1/1 Running 9 9d
kube-flannel-ds-ntdz5 1/1 Running 8 9d
kube-proxy-8k9nt 1/1 Running 9 9d
kube-proxy-jbm5l 1/1 Running 8 9d
kube-proxy-xkpxj 1/1 Running 8 9d
kube-scheduler-k8s-master-01 1/1 Running 9 9d
再看对应的日志
kubectl logs -f -n kube-system kube-apiserver-k8s-master-01
8、k8s各个组件及其协同关系
9、k8s网络流量入栈到出栈的流程
ingress ---> endprints ---> pod
10、ingress nginx原理
一句话,实时将ingress配置清单的内容转化到nginx配置里面,使其生效。从而使nginx代理转发服务
5、存储卷类型及其作用
emptyDir
hostPath
pv/pvc
strangeClass
configMap
secret
6、说明一下pv/pvc
7、部署一个discuz的流程
1、先构建镜像
1、php(mysql 支持php-fpm)
2、nginx
2、设计网络
ingress ---> endprints ---> pod
3、编写配置文件
mysql.yaml
work.yaml
4、测试
8、dockerfile指令
FROM
RUN
ADD
COPY
ENV
EXPOSE
CMD
WORKDIR
ARG
ONBUILD
9、docker网络类型
网桥
none
host
container
使用veth设备对
测试连接数据库
kubectl run test1 -it --rm --image=busybox:1.28.3
nslookup service的名字.命名空间.svc.cluster.local
5、控制器类型
job
cronjob
6、怎样使用动态pv持久化数据库
只要不删除pvc即可。
7、k8s中安全机制是什么?
集群组件之间安全机制: 证书
集群内部的安全机制:准入控制
8、存储卷类型
9、secret挂载到容器的环境变量中
|