沈阳网站建设设计公司,2015微信网站设计,如何在虚拟主机一键安装wordpress,dede网站数据库路径1. Kubernetes 简介 k8s即Kubernetes。其为google开发来被用于容器管理的开源应用程序#xff0c;可帮助创建和管理应用程序的容器化。用一个的例子来描述#xff1a;当虚拟化容器Docker有太多要管理的时候#xff0c;手动管理就会很麻烦#xff0c;于是我们便可以通…1. Kubernetes 简介 k8s即Kubernetes。其为google开发来被用于容器管理的开源应用程序可帮助创建和管理应用程序的容器化。用一个的例子来描述当虚拟化容器Docker有太多要管理的时候手动管理就会很麻烦于是我们便可以通过k8s来简化我们的管理2. 安装 Kubernetes 集群
2.1 裸机搭建
https://k8s.easydoc.net/docs/dRiQjyTY/28366845/6GiNOzyZ/nd7yOvdY#nav_3
2.1.1 凭证问题
用 kubeadm 初始化集群仅在主节点跑# 初始化集群控制台 Control plane
# 失败了可以用 kubeadm reset 重置
kubeadm init --image-repositoryregistry.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 访问到集群2.1.2 踩坑
问题1初始化集群控制台 Control plane
[rootmaster ~]# kubeadm init --image-repositoryregistry.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 --v5 or higher
[rootmaster ~]# 解决
[rootmaster ~]# echo 1 /proc/sys/net/bridge/bridge-nf-call-iptablesFromhttps://blog.csdn.net/qq_30019911/article/details/111415970问题2把工作节点加入集群只在工作节点跑 关闭 swap#临时关闭
swapoff -a
# 永久关闭
vi /etc/fstab
注释以下代码/dev/mapper/centos-swap swap ...2.2 把工作节点接入集群命令
kubeadm join 192.168.3.128:6443 --token i3k3bg.7zveiqaweidk9ene \--discovery-token-ca-cert-hash sha256:e7f23aa05741073a57e4bcd2e0a43d717fc3d25778348b930c786f67c66de4eb2.3 minikube 模拟环境搭建
只是一个 K8S 集群模拟器只有一个节点的集群只为测试用master 和 worker 都在一起。
2.3.1 安装在hk vps安装成功
下载地址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?spm1001.2014.3001.5502
启动minikube。
minikube start --force安装好kubectl后可以正常访问minikube。
3. 部署应用到集群
3.1 部署应用 YAML 文件
3.1.1 直接命令运行创建pod
kubectl run testapp --imageccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1kubectl get pods3.1.2 yaml创建pod
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 pod3.1.3 Deployment批量创建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-k8sspec:# 定义容器可以多个containers:- name: test-k8s # 容器名字image: ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1 # 镜像查看部署
kubectl get deployment查看节点详细信息
kubectl get pod -o wideDeployment 通过 label 关联起来 Pods这些pod可以属于不同节点。
★3.2 常用命令
查看pod状态、详细数据
kubectl describe pod podnameEvents事件这个比较重要如图创建pod拉取镜像创建镜像。
查看pod运行日志
kubectl logs podname
kubectl logs podname -f //持续查看某个pod日志。进入pod容器交互式
kubectl exec -it podname -- bash //进入Pod的第1 个容器
kubectl exec -it podname -c containername -- bash //如果一个pod有多个容器使用-c指定要进入的容器名。查看指定pod中有哪些容器
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增加副本pod数量
方式一
直接在yaml配置文件中修改replicas字段。
spec:replicas: 2方式二(命令创建)
kubectl scale deployment test-k8s --replicas5注意
如果之前有2个修改为5个后会新增3个pod不是5个。减少副本pod数量
kubectl scale deployment test-k8s --replicas2把集群内端口映射到节点
kubectl port-forward pod-name 8090:8080 //外部端口:内部端口看运行日志(每访问一次web会产生一条日志)
删除部署
kubectl delete deployment test-k8s(部署名字)在同时创建多个副本的情况下多个pod会随机跑到多个节点master节点不跑pod。 历史回退
更换错误镜像版本重新部署镜像会先创建新的镜像再删除老镜像 重新部署。 查看历史。
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-revision2查看全部
列出所有信息。
kubectl get all重新部署
删掉老的创建新的。
kubectl rollout restart deployment test-k8s命令修改镜像–record 表示把这个命令记录到操作历史中
kubectl set image deployment test-k8s test-k8sccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v2-with-error --record把deployment输出到一个文件信息
kubectl get deployment test-k8s -o yaml app2.yaml
也可以用json格式显示-o json。删除全部pod、deployment。
kubectl delete all --all将pod指定到某个节点运行
将 Pod 指定到某个节点运行nodeselector 限定 CPU、内存总量文档
apiVersion: v1
kind: Pod
metadata:name: nginxlabels:env: test
spec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresentnodeSelector:disktype: ssd ###这里指定节点名字。其他命令
# 暂停运行暂停后对 deployment 的修改不会立刻生效恢复后才应用设置
kubectl rollout pause deployment test-k8s
# 恢复
kubectl rollout resume deployment test-k8s3.3 工作负载分类
Deployment 适合无状态应用所有pod等价可替代。StatefulSet 有状态的应用适合数据库这种类型。DaemonSet 在每个节点上跑一个 Pod可以用来做节点监控、节点日志收集等。Job CronJob Job 用来表达的是一次性的任务而 CronJob 会根据其时间规划反复运行。
3.4 现存问题
每次只能访问一个 pod没有负载均衡自动转发到不同 pod访问还需要端口转发Pod 重创后 IP 变了名字也变了
4. Service
4.1 特性
Service 通过 label 关联对应的 PodServcie 生命周期不跟 Pod 绑定不会因为 Pod 重创改变 IP提供了负载均衡功能自动转发流量到不同 Pod可对集群外部提供访问端口集群内部可通过服务名字访问 4.2 创建ServiceClusterIP 集群内
创建一个 Service通过标签test-k8s跟对应的 Pod 关联上。 service.yaml 应用配置 kubectl apply -f service.yaml 查看服务 kubectl get svc
默认ClusterIP 集群内(进入一个pod访问)可以访问
apiVersion: v1
kind: Service
metadata:name: test-k8s ## 服务名字
spec:selector:app: test-k8s ## 标签关联pod# 默认ClusterIP 集群内可以访问NodePort 节点可访问LoadBalancer 负载均衡模式需要负载均衡器才可用type: ClusterIPports:- port: 8080 # 本 Service 的端口targetPort: 8080 # 容器端口#nodePort: 31000 # 节点端口范围固定 30000 ~ 32767 在集群内访问需要注释掉此条目。服务的默认类型是ClusterIP只能在集群内部访问我们可以进入到 Pod 里面访问
kubectl exec -it pod-name -- bashcurl http://test-k8s:8080 //服务名称访问
curl http://10.109.106.61:8080 //服务IP访问如果要在集群外部访问可以通过端口转发实现只适合临时测试用
kubectl port-forward service/test-k8s 8888:80804.3 对外暴露服务NodePort 节点可访问
apiVersion: v1
kind: Service
metadata:name: test-k8s ## 服务名字
spec:selector:app: test-k8s ## 标签关联pod# 默认ClusterIP 集群内可以访问NodePort 节点可访问LoadBalancer 负载均衡模式需要负载均衡器才可用type: NodePortports:- port: 8080 # 本 Service 的端口targetPort: 8080 # 容器端口nodePort: 31000 # 节点端口范围固定 30000 ~ 32767 在集群内访问需要注释掉此条目。对外暴露到端口31000。 这个对外暴露的端口是暴露在docker里minikube所在的容器还存在负载均衡转发。 其他 Loadbalancer 也可以对外提供服务这需要一个负载均衡器的支持因为它需要生成一个新的 IP 对外服务否则状态就一直是 pendding这个很少用了后面我们会讲更高端的 Ingress 来代替它。
4.4 多端口
多端口时必须配置 name 文档。
apiVersion: v1
kind: Service
metadata:name: test-k8s
spec:selector:app: test-k8stype: NodePortports:- port: 8080 # 本 Service 的端口name: test-k8s # 必须配置targetPort: 8080 # 容器端口nodePort: 31000 # 节点端口范围固定 30000 ~ 32767- port: 8090name: test-othertargetPort: 8090nodePort: 320004.5 总结
ClusterIP 默认的仅在集群内可用 NodePort 暴露端口到节点提供了集群外部访问的入口 端口范围固定 30000 ~ 32767 LoadBalancer 需要负载均衡器通常都需要云服务商提供裸机可以安装 METALLB 测试 会额外生成一个 IP 对外服务 K8S 支持的负载均衡器负载均衡器。 Headless 适合数据库 clusterIp 设置为 None 就变成 Headless 了不会再分配 IP后面会再讲到具体用法官网文档。
5. Statefulset
5.1 什么是Statefulset StatefulSet 是用来管理有状态的应用例如数据库。前面我们部署的应用都是不需要存储数据不需要记住状态的可以随意扩充副本每个副本都是一样的可替代的。而像数据库、Redis 这类有状态的则不能随意扩充副本。StatefulSet 会固定每个 Pod 的名字 5.2 部署Statefulset类型的Mongodb
apiVersion: apps/v1
kind: StatefulSet
metadata:name: mongodb
spec:serviceName: mongodbreplicas: 3selector:matchLabels:app: mongodbtemplate:metadata:labels:app: mongodbspec:containers:- name: mongoimage: mongo:4.4# IfNotPresent 仅本地没有镜像时才远程拉Always 永远都是从远程拉Never 永远只用本地镜像本地没有则报错imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:name: mongodb
spec:selector:app: mongodbtype: ClusterIP# HeadLessclusterIP: None ###不设置ip仅通过服务名访问。ports:- port: 27017targetPort: 27017 5.3 StatefulSet 特性
Service 的 CLUSTER-IP 是空的Pod 名字也是固定的。Pod 创建和销毁是有序的创建是顺序的销毁是逆序的。Pod 重建不会改变名字IP会改变所以不要用IP直连。
访问时如果直接使用 Service 名字连接会随机转发请求 要连接指定 Pod可以这样pod-name.service-name 运行一个临时 Pod 连接数据测试下
kubectl run mongodb-client --rm --tty -i --restartNever --image docker.io/bitnami/mongodb:4.4.10-debian-10-r20 --command -- bashmongo --host mongodb-0.mongodb6. 参考
视频地址https://www.bilibili.com/video/BV1Tg411P7EB/ 课件来源https://k8s.easydoc.net