k8s搭建一个lnmp本地环境的完整过程
1.安装k8s
本机使用了Mac下的Docker Desktop下的k8s环境。
k8s镜像国内下载:Docker Desktop for Mac/Windows 开启 Kubernetes
Dashboard登录Token过期时间修改
本地测试TOKEN是不是经常过期?在构建文件recommended.yaml的–namespace=kubernetes-dashboard下增加一行ttl即可。
已经启动了怎么办?修改已经启动yaml文件,大概在143行下新增ttl。
kubectl edit deployment -n kubernetes-dashboard
2.基本概念介绍
1.架构核心组件了解
k8s使用类似master/node(cluster)的模型,由客户端发送请求给master的api server,master的api server收到请求后查询ETCD的变动,ETCD进行Controller Manager和Scheduler内部调度后返回给api server,最后转发给对应的node去执行。
图片来源B站UP主:free-coder的【kubernetes入门】快速了解和上手容器编排工具k8s
客户端请求方式 | 描述 |
---|---|
kubectl | 命令行工具 |
webUI | 通过Dashboard操作发出请求 |
RestAPI | 自定义,可以给webUI增加功能。 |
master组件 | 描述 |
---|---|
api server | 资源操作的唯一入口,提供认证、授权、访问控制、API 注册和发现等机制。 |
ETCD | 保存整个集群的状态,Raft分布式的kv数据库 |
Controller Manager | 资源控制中心,维护集群的状态,比如故障检测、自动扩展、滚动更新等 |
Scheduler | 调度的主要实施者,按照预定的调度策略将 Pod 调度到相应的机器上 |
node组件 | 描述 |
---|---|
kubelet | 维护容器的生命周期,同时也负责 Volume(CVI)和网络(CNI)的管理 |
kube-proxy | 为 Service 提供 cluster 内部的服务发现和负载均衡 |
container runtime | 镜像管理以及 Pod 和容器的真正运行(CRI ),被调度的实际容器(docker) |
更多请参考Kubernetes指南 核心组件
2.资源对象了解
类型 | 资源名 | 描述 |
---|---|---|
集群 | Namespace | 命名空间起隔离作用,初始化有default和kube-system,方便划分项目组或用户组 |
集群 | Node | Pod真正运行的主机,一定包含kubelet、kube-proxy、Container runtime |
工作资源 | POD | 调度的基本单位,多个容器共享网络和文件系统,共享IPC、PID、network和namespace |
工作资源 | ReplicaSet | 新一代RC(Replication Controller),保证集群中运行指定数目的Pod副本 |
工作资源 | Deployment | 部署表示用户对K8s集群的一次更新操作,声明式操作。 |
工作资源 | StatefulSet | 有状态服务集,确保pod与数据保持连续性,适合跑mysql等挂载数据的服务 |
工作资源 | DaemonSet | 后台支撑服务集,有些节点需要有些节点不需要的,存储、日志和监控等在每个节点上支撑K8s集群运行的服务。 |
工作资源 | Job | 任务,全局的工作队列,控制批处理型任务的API对象。 |
服务发现及均衡资源 | Service | 将多个pod抽象为一个ServiceIP(iptables),通过 labels 为应用提供负载均衡和服务发现,解决Pod 的 IP 地址会随着 Pod 的重启而变化的问题 |
服务发现及均衡资源 | Ingress | 路由,进入集群的请求提供路由规则的集合,给 service 提供集群外部访问的 URL、负载均衡、SSL 终止、HTTP 路由等 |
配置与存储 | Volume | 让k8s具备存储资源抽象能力,其中持久存储卷(Persistent Volume,PV)由资源提供者配置,持久存储卷声明(Persistent Volume Claim,PVC)由资源使用者根据业务申请 |
配置与存储 | ConfigMap | 用于保存配置数据的键值对,相比secret可以保存非敏感信息 |
配置与存储 | Secret | 解决了密码、token、密钥等敏感数据的配置问题,不需要暴露到镜像或pod里。 |
更多请参考Kubernetes指南 资源
3.lnmp构建文件介绍
.
├── kustomization.yaml #整合多套生产、开发的yaml文件方便管理。
├── local-storage.yaml #通过hostPath创建PV和PVC
├── local_storage
│ ├── mysql #数据持久化目录
│ └── wordpress #应用代码持久化目录
├── mysql-deployment.yaml #mysql的svc和Deployment管理的pod
├── nginx-deployment.yaml #与上类似,多了ConfigMap管理配置和LoadBalancer直接暴露IP。
├── php-deployment.yaml #与上类似
└── php-fpm
└── Dockerfile #装了mysql扩展的php镜像
本地环境设置分两部分:
- 镜像拉去imagePullPolicy: Never ,镜像优先从本地仓库查找。
- PV设置hostPath的绝对路径。
- 同一个下PVC使用不同的目录subPath。
生成带mysql扩展的php镜像,提供给k8s使用。
docker build -t k8s-php7-fpm php-fpm/.
运行kustomization.yaml文件即可。
kubectl apply -k .
4.kubectl常用命令
类似对pod命令,也对deployment、Service、PVC等资源适用,可以举一反三。
kubectl cluster-info #查询集群运行信息、版本。
kubectl apply -f test.yaml #部署指定文件,--file
kubectl delete -f test.yaml #取消部署
kubectl run d1 --image httpd:alpine --port 80 #创建d1的Apache镜像
kubectl exec -it redis-master-59694fd4d5-txcbc sh #以sh进入容器
kubectl logs -f redis-master-59694fd4d5-txcbc #查看运行时容器内的log
kubectl get - 类似于 docker ps,查询资源列表
kubectl describe - 类似于 docker inspect,获取资源的详细信息
kubectl logs - 类似于 docker logs,获取容器的日志
kubectl exec - 类似于 docker exec,在容器内执行一个命令
kubectl get pod --output=wide #更多的pod信息
kubectl get pods -A #--all-namespaces所有命名空间下的pod
kubectl describe pods #更详细的pods信息
kubectl get pods -w -l #watch命令,挂起观察
kubectl get events -A --sort-by='.metadata.creationTimestamp' #查询运行时事件倒序
kubectl expose deployment d1 --target-port 80 --type NodePort #将d1暴露为一个svc,指定80端口和NodePort类型。
kubectl scale --replicas=3 deployment/nginx-app #自动扩容到3个,自动加入退出service。
kubectl rolling-update frontend-v1 frontend-v2 --image=image:v2 #滚动升级,默认,无中断服务升级
kubectl rolling-update frontend-v1 frontend-v2 --rollback #回滚
kubectl rollout status deployment/nginx-app #查看滚动状态
for i in 0 5; do kubectl exec "web-$i" -- sh -c 'hostname'; done #循环打印web-0到5容器的的hostname
for i in 0 5; do kubectl exec "web-$i" -- sh -c 'echo "$(hostname)" > /usr/share/nginx/html/index.html'; done #写入nginx hostname
5.遇到的坑
Docker Desktop for Mac : Kubernetes is starting
重写构建验证包,重启k8s,耐心等待几分钟。
rm -rf ~/Library/Group\ Containers/group.com.docker/pki/