k8s即Kubernetes。
其为google开发来被用于容器管理的开源应用程序,可帮助创建和管理应用程序的容器化。
用一个的例子来描述:"当虚拟化容器Docker有太多要管理的时候,手动管理就会很麻烦,于是我们便可以通过k8s来简化我们的管理"
https://k8s.easydoc.net/docs/dRiQjyTY/28366845/6GiNOzyZ/nd7yOvdY#nav_3
用 kubeadm 初始化集群(仅在主节点跑),
# 初始化集群控制台 Control plane
# 失败了可以用 kubeadm reset 重置
kubeadm init --image-repository=registry.aliyuncs.com/google_containers
# 记得把 kubeadm join xxx 保存起来
# 忘记了重新获取:kubeadm token create --print-join-command
# 复制授权文件,以便 kubectl 可以有权限访问集群
# 如果你其他节点需要访问集群,需要从主节点复制这个文件过去其他节点
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
# 在其他机器上创建 ~/.kube/config 文件也能通过 kubectl 访问到集群
[root@master ~]# kubeadm init --image-repository=registry.aliyuncs.com/google_containers
I1102 21:38:18.266955 2675 version.go:255] remote version is much newer: v1.25.3; falling back to: stable-1.22
[init] Using Kubernetes version: v1.22.15
[preflight] Running pre-flight checks
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
[ERROR Swap]: running with swap on is not supported. Please disable swap
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher
[root@master ~]#
[root@master ~]# echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables
From:https://blog.csdn.net/qq_30019911/article/details/111415970
关闭 swap
#临时关闭
swapoff -a
# 永久关闭
vi /etc/fstab
注释以下代码
/dev/mapper/centos-swap swap ...
kubeadm join 192.168.3.128:6443 --token i3k3bg.7zveiqaweidk9ene \
--discovery-token-ca-cert-hash sha256:e7f23aa05741073a57e4bcd2e0a43d717fc3d25778348b930c786f67c66de4eb
只是一个 K8S 集群模拟器,只有一个节点的集群,只为测试用,master 和 worker 都在一起。
下载地址:https://minikube.sigs.k8s.io/docs/start/
Linux安装kubernetes(minikube):https://blog.csdn.net/weixin_44379605/article/details/123240857
minikube和kubectl安装:https://blog.csdn.net/weixin_44379605/article/details/123124172?spm=1001.2014.3001.5502
启动minikube。
minikube start --force
kubectl run testapp --image=ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1
kubectl get pods
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
# 定义容器,可以多个
containers:
- name: test-k8s # 容器名字
image: ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1 # 镜像
---
kubectl apply -f podcreate.yaml
kubectl get pod
批量创建2个pod。
apiVersion: apps/v1
kind: Deployment
metadata:
# 部署名字
name: test-k8s
spec:
replicas: 2
# 用来查找关联的 Pod,所有标签都匹配才行
selector:
matchLabels:
app: test-k8s ### 标签
# 定义 Pod 相关数据
template:
metadata:
labels:
app: test-k8s
spec:
# 定义容器,可以多个
containers:
- name: test-k8s # 容器名字
image: ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1 # 镜像
kubectl get deployment
kubectl get pod -o wide
Deployment 通过 label 关联起来 Pods,这些pod可以属于不同节点。
kubectl describe pod podname
Events(事件),这个比较重要,如图,创建pod,拉取镜像,创建镜像。
kubectl logs podname
kubectl logs podname -f //持续查看某个pod日志。
kubectl exec -it podname -- bash //进入Pod的第1 个容器
kubectl exec -it podname -c containername -- bash //如果一个pod有多个容器,使用-c指定要进入的容器名。
kubectl get pods podname -o jsonpath={.spec.containers[*].name} -n namespace
kubectl get pods kube-scheduler-superboy-virtual-machine -o jsonpath={.spec.containers[*].name} -n kube-system
方式一:
直接在yaml配置文件中修改replicas字段。
spec:
replicas: 2
方式二(命令创建):
kubectl scale deployment test-k8s --replicas=5
注意:
如果之前有2个,修改为5个后,会新增3个pod,不是5个。
kubectl scale deployment test-k8s --replicas=2
kubectl port-forward pod-name 8090:8080 //外部端口:内部端口
kubectl delete deployment test-k8s(部署名字)
更换错误镜像版本,重新部署镜像,会先创建新的镜像,再删除老镜像
重新部署。
查看历史。
kubectl rollout history deployment test-k8s
kubectl rollout undo deployment test-k8s(部署名字)
回退到指定版本:
这里可以先查看有哪些版本[ kubectl rollout history deployment test-k8s ],再回退。
kubectl rollout undo deployment test-k8s --to-revision=2
列出所有信息。
kubectl get all
删掉老的,创建新的。
kubectl rollout restart deployment test-k8s
kubectl set image deployment test-k8s test-k8s=ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v2-with-error --record
kubectl get deployment test-k8s -o yaml >> app2.yaml
也可以用json格式显示(-o json)。
kubectl delete all --all
将 Pod 指定到某个节点运行:nodeselector
限定 CPU、内存总量:文档
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
nodeSelector:
disktype: ssd ###这里指定节点名字。
# 暂停运行,暂停后,对 deployment 的修改不会立刻生效,恢复后才应用设置
kubectl rollout pause deployment test-k8s
# 恢复
kubectl rollout resume deployment test-k8s
创建一个 Service,通过标签test-k8s跟对应的 Pod 关联上。
service.yaml
应用配置 kubectl apply -f service.yaml
查看服务 kubectl get svc
apiVersion: v1
kind: Service
metadata:
name: test-k8s ## 服务名字!
spec:
selector:
app: test-k8s ## 标签关联pod
# 默认ClusterIP 集群内可以访问,NodePort 节点可访问,LoadBalancer 负载均衡模式(需要负载均衡器才可用)
type: ClusterIP
ports:
- port: 8080 # 本 Service 的端口
targetPort: 8080 # 容器端口
#nodePort: 31000 # 节点端口,范围固定 30000 ~ 32767 ,在集群内访问需要注释掉此条目。
服务的默认类型是ClusterIP,只能在集群内部访问,我们可以进入到 Pod 里面访问:
kubectl exec -it pod-name -- bash
curl http://test-k8s:8080 //服务名称访问
curl http://10.109.106.61:8080 //服务IP访问
如果要在集群外部访问,可以通过端口转发实现(只适合临时测试用):
kubectl port-forward service/test-k8s 8888:8080
apiVersion: v1
kind: Service
metadata:
name: test-k8s ## 服务名字!
spec:
selector:
app: test-k8s ## 标签关联pod
# 默认ClusterIP 集群内可以访问,NodePort 节点可访问,LoadBalancer 负载均衡模式(需要负载均衡器才可用)
type: NodePort
ports:
- port: 8080 # 本 Service 的端口
targetPort: 8080 # 容器端口
nodePort: 31000 # 节点端口,范围固定 30000 ~ 32767 ,在集群内访问需要注释掉此条目。
对外暴露到端口31000。
这个对外暴露的端口是暴露在docker里,minikube所在的容器,还存在负载均衡转发。
其他:
Loadbalancer 也可以对外提供服务,这需要一个负载均衡器的支持,因为它需要生成一个新的 IP 对外服务,否则状态就一直是 pendding,这个很少用了,后面我们会讲更高端的 Ingress 来代替它。
多端口时必须配置 name, 文档。
apiVersion: v1
kind: Service
metadata:
name: test-k8s
spec:
selector:
app: test-k8s
type: NodePort
ports:
- port: 8080 # 本 Service 的端口
name: test-k8s # 必须配置
targetPort: 8080 # 容器端口
nodePort: 31000 # 节点端口,范围固定 30000 ~ 32767
- port: 8090
name: test-other
targetPort: 8090
nodePort: 32000
ClusterIP
默认的,仅在集群内可用
NodePort
暴露端口到节点,提供了集群外部访问的入口
端口范围固定 30000 ~ 32767
LoadBalancer
需要负载均衡器(通常都需要云服务商提供,裸机可以安装 METALLB 测试)
会额外生成一个 IP 对外服务
K8S 支持的负载均衡器:负载均衡器。
Headless
适合数据库
clusterIp 设置为 None 就变成 Headless 了,不会再分配 IP,后面会再讲到具体用法:官网文档。
StatefulSet 是用来管理有状态的应用,例如数据库。
前面我们部署的应用,都是不需要存储数据,不需要记住状态的,可以随意扩充副本,每个副本都是一样的,可替代的。
而像数据库、Redis 这类有状态的,则不能随意扩充副本。
StatefulSet 会固定每个 Pod 的名字
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mongodb
spec:
serviceName: mongodb
replicas: 3
selector:
matchLabels:
app: mongodb
template:
metadata:
labels:
app: mongodb
spec:
containers:
- name: mongo
image: mongo:4.4
# IfNotPresent 仅本地没有镜像时才远程拉,Always 永远都是从远程拉,Never 永远只用本地镜像,本地没有则报错
imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:
name: mongodb
spec:
selector:
app: mongodb
type: ClusterIP
# HeadLess
clusterIP: None ###不设置ip,仅通过服务名访问。
ports:
- port: 27017
targetPort: 27017
访问时,如果直接使用 Service 名字连接,会随机转发请求
要连接指定 Pod,可以这样pod-name.service-name
运行一个临时 Pod 连接数据测试下
kubectl run mongodb-client --rm --tty -i --restart='Never' --image docker.io/bitnami/mongodb:4.4.10-debian-10-r20 --command -- bash
mongo --host mongodb-0.mongodb
视频地址:https://www.bilibili.com/video/BV1Tg411P7EB/
课件来源:https://k8s.easydoc.net