我的Mall电商实战我的项目始终应用的是Docker容器化部署,有很多敌人倡议搞个Kubernetes部署。最近正好在学习Kubernetes,筹备更新一波!明天咱们先来学习下Kubernetes的外围概念和根本应用,心愿对大家有所帮忙!
SpringBoot实战电商我的项目mall(40k+star)地址:https://github.com/macrozheng/mall
Kubernetes简介
Kubernetes(简称K8S,K和S之间有8个字母)是用于主动部署,扩大和治理容器化应用程序的开源零碎。它将组成应用程序的容器组合成逻辑单元,以便于管理和服务发现。Kubernetes 源自Google 15 年生产环境的运维教训,同时凝聚了社区的最佳创意和实际。
Kubernetes具备如下个性:
- 服务发现与负载平衡:无需批改你的应用程序即可应用生疏的服务发现机制。
- 存储编排:主动挂载所选存储系统,包含本地存储。
- Secret和配置管理:部署更新Secrets和应用程序的配置时不用从新构建容器镜像,且不用将软件堆栈配置中的机密信息裸露进去。
- 批量执行:除了服务之外,Kubernetes还能够治理你的批处理和CI工作负载,在冀望时替换掉生效的容器。
- 程度扩缩:应用一个简略的命令、一个UI或基于CPU应用状况主动对应用程序进行扩缩。
- 自动化上线和回滚:Kubernetes会分步骤地将针对利用或其配置的更改上线,同时监督应用程序运行状况以确保你不会同时终止所有实例。
- 主动装箱:依据资源需要和其余束缚主动搁置容器,同时防止影响可用性。
- 自我修复:重新启动失败的容器,在节点死亡时替换并从新调度容器,杀死不响应用户定义的健康检查的容器。
Minikube简介
Minikube是一种轻量级的Kubernetes实现,可在本地计算机上创立VM并部署仅蕴含一个节点的简略集群,Minikube可用于Linux、MacOS和Windows零碎。Minikube CLI提供了用于疏导集群工作的多种操作,包含启动、进行、查看状态和删除。
Kubernetes外围概念
因为Kubernetes有很多外围概念,学习它们对了解Kubernetes的应用很有帮忙,所以咱们先来学习下这些外围概念。
Node
Kubernetes集群是指Kubernetes协调一个高可用计算机集群,每个计算机作为独立单元相互连贯工作。
一个Kubernetes集群蕴含两种类型的资源:
- Master:负责管理整个集群。协调集群中的所有流动,例如调度利用、保护利用的所需状态、利用扩容以及推出新的更新。
- Node:用于托管正在运行的利用。能够是一个虚拟机或者物理机,它在Kubernetes集群中充当工作机器的角色,每个Node都有Kubelet,它治理Node而且是Node与Master通信的代理,Node还具备用于解决容器操作的工具,例如Docker或rkt。
Deployment
Deployment负责创立和更新应用程序的实例。创立Deployment后,Kubernetes Master 将应用程序实例调度到集群中的各个节点上。如果托管实例的节点敞开或被删除,Deployment控制器会将该实例替换为群集中另一个节点上的实例。这提供了一种自我修复机制来解决机器故障保护问题。
能够应用Kubernetes命令行界面Kubectl创立和治理Deployment。Kubectl应用Kubernetes API与集群进行交互。
Pod
Pod相当于逻辑主机
的概念,负责托管利用实例。包含一个或多个应用程序容器(如 Docker),以及这些容器的一些共享资源(共享存储、网络、运行信息等)。
Service
Service是一个形象层,它定义了一组Pod的逻辑集,并为这些Pod反对内部流量裸露、负载平衡和服务发现。
只管每个Pod 都有一个惟一的IP地址,然而如果没有Service,这些IP不会裸露在群集内部。Service容许您的应用程序接管流量。Service也能够用在ServiceSpec标记type的形式裸露,type类型如下:
- ClusterIP(默认):在集群的外部IP上公开Service。这种类型使得Service只能从集群内拜访。
- NodePort:应用NAT在集群中每个选定Node的雷同端口上公开Service。应用
<NodeIP>:<NodePort>
从集群内部拜访Service。是ClusterIP的超集。 - LoadBalancer:在以后云中创立一个内部负载均衡器(如果反对的话),并为Service调配一个固定的内部IP。是NodePort的超集。
- ExternalName:通过返回带有该名称的CNAME记录,应用任意名称(由spec中的externalName指定)公开Service。不应用代理。
Docker装置
因为Kubernetes运行须要依赖容器运行时
(负责运行容器的软件),现比拟通用的容器运行时有Docker、containerd和CRI-O。这里抉择Docker,先在Linux服务器上安装好Docker环境。
- 装置
yum-utils
:
yum install -y yum-utils device-mapper-persistent-data lvm2
- 为yum源增加docker仓库地位:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- 装置Docker:
yum install docker-ce
- 启动Docker:
systemctl start docker
Minikube装置
- 首先咱们须要下载Minikube的二进制安装包并装置:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64sudo install minikube-linux-amd64 /usr/local/bin/minikube
- 而后应用如下命令启动Minikube:
minikube start
- 如果你应用的是
root
用户的话会无奈启动并提醒如下信息,那是因为Minikube不容许应用root权限启动,须要创立一个非root账号再启动;
* minikube v1.16.0 on Centos 7.6.1810* Automatically selected the docker driver* The "docker" driver should not be used with root privileges.* If you are running minikube within a VM, consider using --driver=none:* https://minikube.sigs.k8s.io/docs/reference/drivers/none/X Exiting due to DRV_AS_ROOT: The "docker" driver should not be used with root privileges.
- 这里创立了一个属于
docker
用户组的macro
用户,并切换到该用户;
# 创立用户useradd -u 1024 -g docker macro# 设置用户明码passwd macro# 切换用户su macro
- 再次应用
minikube start
命令启动Minikube,启动胜利后会显示如下信息:
* To pull new external images, you may need to configure a proxy: https://minikube.sigs.k8s.io/docs/reference/networking/proxy/* Preparing Kubernetes v1.20.0 on Docker 20.10.0 ... - Generating certificates and keys ... - Booting up control plane ... - Configuring RBAC rules ...* Verifying Kubernetes components...* Enabled addons: default-storageclass, storage-provisioner* kubectl not found. If you need it, try: 'minikube kubectl -- get pods -A'* Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
Kubernetes的应用
创立集群
通过Minikube咱们能够创立一个单节点的K8S集群,集群治理Master和负责运行利用的Node都部署在此节点上。
- 查看Minikube的版本号:
minikube version
minikube version: v1.16.0commit: 9f1e482427589ff8451c4723b6ba53bb9742fbb1
- 查看kubectl的版本号,第一次应用会间接装置kubectl:
minikube kubectl version
Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.0", GitCommit:"af46c47ce925f4c4ad5cc8d1fca46c7b77d13b38", GitTreeState:"clean", BuildDate:"2020-12-08T17:59:43Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"}Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.0", GitCommit:"af46c47ce925f4c4ad5cc8d1fca46c7b77d13b38", GitTreeState:"clean", BuildDate:"2020-12-08T17:51:19Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"linux/amd64"}
- 如果你想间接应用kubectl命令的话,能够将其复制到
/bin
目录上来:
# 查找kubectl命令的地位find / -name kubectl# 找到之后复制到/bin目录下cp /mydata/docker/volumes/minikube/_data/lib/minikube/binaries/v1.20.0/kubectl /bin/# 间接应用kubectl命令kubectl version
- 查看集群详细信息:
kubectl cluster-info
Kubernetes control plane is running at https://192.168.49.2:8443KubeDNS is running at https://192.168.49.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxyTo further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
- 查看集群中的所有Node,能够发现Minikube创立了一个单节点的简略集群:
kubectl get nodes
NAME STATUS ROLES AGE VERSIONminikube Ready control-plane,master 46m v1.20.0
部署利用
一旦运行了K8S集群,就能够在其上部署容器化应用程序。通过创立Deployment对象,能够指挥K8S如何创立和更新应用程序的实例。
- 指定好利用镜像并创立一个Deployment,这里创立一个Nginx利用:
kubectl create deployment kubernetes-nginx --image=nginx:1.10
创立一个Deployment时K8S会产生如下操作:
- 抉择一个适合的Node来部署这个利用;
- 将该利用部署到Node上;
- 当利用异样敞开或删除时重新部署利用。
- 查看所有Deployment:
kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGEkubernetes-nginx 1/1 1 1 21h
- 咱们能够通过
kubectl proxy
命令创立一个代理,这样就能够通过裸露进去的接口间接拜访K8S的API了,这里调用了查问K8S版本的接口;
[macro@linux-local root]$ kubectl proxyStarting to serve on 127.0.0.1:8001[root@linux-local ~]# curl http://localhost:8001/version{ "major": "1", "minor": "20", "gitVersion": "v1.20.0", "gitCommit": "af46c47ce925f4c4ad5cc8d1fca46c7b77d13b38", "gitTreeState": "clean", "buildDate": "2020-12-08T17:51:19Z", "goVersion": "go1.15.5", "compiler": "gc", "platform": "linux/amd64"}
查看利用
通过对运行利用的Pod进行操作,能够查看容器日志,也能够执行容器外部命令。
- 查看K8s中所有Pod的状态:
kubectl get pods
NAME READY STATUS RESTARTS AGEkubernetes-nginx-78bcc44665-8fnnn 1/1 Running 1 21h
- 查看Pod的具体状态,包含IP地址、占用端口、应用镜像等信息;
kubectl describe pods
Name: kubernetes-nginx-78bcc44665-8fnnnNamespace: defaultPriority: 0Node: minikube/192.168.49.2Start Time: Tue, 05 Jan 2021 13:57:46 +0800Labels: app=kubernetes-nginx pod-template-hash=78bcc44665 version=v1Annotations: <none>Status: RunningIP: 172.17.0.7IPs: IP: 172.17.0.7Controlled By: ReplicaSet/kubernetes-nginx-78bcc44665Containers: nginx: Container ID: docker://31eb1277e507ec4cf8a27b66a9f4f30fb919d17f4cd914c09eb4cfe8322504b2 Image: nginx:1.10 Image ID: docker-pullable://nginx@sha256:6202beb06ea61f44179e02ca965e8e13b961d12640101fca213efbfd145d7575 Port: <none> Host Port: <none> State: Running Started: Wed, 06 Jan 2021 09:22:40 +0800 Last State: Terminated Reason: Completed Exit Code: 0 Started: Tue, 05 Jan 2021 14:24:55 +0800 Finished: Tue, 05 Jan 2021 17:32:48 +0800 Ready: True Restart Count: 1 Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-dhr4b (ro)Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True Volumes: default-token-dhr4b: Type: Secret (a volume populated by a Secret) SecretName: default-token-dhr4b Optional: falseQoS Class: BestEffortNode-Selectors: <none>Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300sEvents: <none>
- 将Pod的名称设置为环境变量,不便之后应用
$POD_NAME
来利用Pod的名称:
export POD_NAME=kubernetes-nginx-78bcc44665-8fnnn
- 查看Pod打印的日志:
kubectl logs $POD_NAME
- 应用
exec
能够在Pod的容器中执行命令,这里应用env
命令查看环境变量:
kubectl exec $POD_NAME -- env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binHOSTNAME=kubernetes-nginx-78bcc44665-8fnnnKUBERNETES_PORT_443_TCP_ADDR=10.96.0.1KUBERNETES_SERVICE_HOST=10.96.0.1KUBERNETES_SERVICE_PORT=443KUBERNETES_SERVICE_PORT_HTTPS=443KUBERNETES_PORT=tcp://10.96.0.1:443KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443KUBERNETES_PORT_443_TCP_PROTO=tcpKUBERNETES_PORT_443_TCP_PORT=443NGINX_VERSION=1.10.3-1~jessieHOME=/root
- 进入容器外部并执行
bash
命令,如果想退出容器能够应用exit
命令:
kubectl exec -ti $POD_NAME -- bash
公开裸露利用
默认Pod无奈被集群内部拜访,须要创立Service并裸露端口能力被内部拜访。
- 创立一个Service来裸露kubernetes-nginx这个Deployment:
kubectl expose deployment/kubernetes-nginx --type="NodePort" --port 80
- 查看K8S中所有Service的状态:
kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5h16mkubernetes-nginx NodePort 10.105.177.114 <none> 80:31891/TCP 5s
- 查看Service的详情,通过
NodePort
属性能够失去裸露到内部的端口;
kubectl describe services/kubernetes-nginx
Name: kubernetes-nginxNamespace: defaultLabels: app=kubernetes-nginxAnnotations: <none>Selector: app=kubernetes-nginxType: NodePortIP Families: <none>IP: 10.106.227.54IPs: 10.106.227.54Port: <unset> 80/TCPTargetPort: 80/TCPNodePort: <unset> 30158/TCPEndpoints: 172.17.0.7:80Session Affinity: NoneExternal Traffic Policy: ClusterEvents: <none>
- 通过CURL命令通过
Minikube IP:NodePort IP
能够拜访Nginx服务,此时将打印Nginx主页信息;
curl $(minikube ip):30158
<!DOCTYPE html><html><head><title>Welcome to nginx!</title><style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; }</style></head><body><h1>Welcome to nginx!</h1><p>If you see this page, the nginx web server is successfully installed andworking. Further configuration is required.</p><p>For online documentation and support please refer to<a href="http://nginx.org/">nginx.org</a>.<br/>Commercial support is available at<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p></body></html>
标签的应用
通过给资源增加Label,能够不便地治理资源(如Deployment、Pod、Service等)。
- 查看Deployment中所蕴含的Label;
kubectl describe deployment
Name: kubernetes-nginxNamespace: defaultCreationTimestamp: Tue, 05 Jan 2021 13:57:46 +0800Labels: app=kubernetes-nginxAnnotations: deployment.kubernetes.io/revision: 1Selector: app=kubernetes-nginxReplicas: 1 desired | 1 updated | 1 total | 1 available | 0 unavailableStrategyType: RollingUpdateMinReadySeconds: 0RollingUpdateStrategy: 25% max unavailable, 25% max surge
- 通过Label查问Pod:
kubectl get pods -l app=kubernetes-nginx
NAME READY STATUS RESTARTS AGEkubernetes-nginx-78bcc44665-8fnnn 1/1 Running 1 21h
- 通过Label查问Service:
kubectl get services -l app=kubernetes-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes-nginx NodePort 10.106.227.54 <none> 80:30158/TCP 4m44s
- 给Pod增加Label:
kubectl label pod $POD_NAME version=v1
- 查看Pod的详细信息,能够查看Label信息:
kubectl describe pods $POD_NAME
Name: kubernetes-nginx-78bcc44665-8fnnnNamespace: defaultPriority: 0Node: minikube/192.168.49.2Start Time: Tue, 05 Jan 2021 13:57:46 +0800Labels: app=kubernetes-nginx pod-template-hash=78bcc44665 version=v1
- 通过Label查问Pod:
kubectl get pods -l version=v1
- 通过Label删除服务:
kubectl delete service -l app=kubernetes-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 <none> 443/TCP 30h
可视化治理
Dashboard是基于网页的K8S用户界面。你能够应用Dashboard将容器利用部署到K8S集群中,也能够对容器利用排错,还能治理集群资源。
- 查看Minikube内置插件,默认状况下Dashboard插件未启用:
minikube addons list
|-----------------------------|----------|--------------|| ADDON NAME | PROFILE | STATUS ||-----------------------------|----------|--------------|| dashboard | minikube | disabled || default-storageclass | minikube | enabled ✅ ||-----------------------------|----------|--------------|
- 启用Dashboard插件:
minikube addons enable dashboard
- 开启Dashboard,通过
--url
参数不会关上治理页面,并能够在控制台取得拜访门路:
minikube dashboard --url
* Verifying dashboard health ...* Launching proxy ...* Verifying proxy health ...http://127.0.0.1:44469/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/
- 要想从内部拜访Dashboard,须要从应用kubectl设置代理才行,
--address
设置为你的服务器地址;
kubectl proxy --port=44469 --address='192.168.5.94' --accept-hosts='^.*' &
- 从内部拜访服务器须要开启防火墙端口;
# 切换到root用户su -# 开启端口firewall-cmd --zone=public --add-port=44469/tcp --permanent# 重启防火墙firewall-cmd --reload
- 通过如下地址即可拜访Dashboard:
http://192.168.5.94:44469/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/
- 查看K8S集群中的资源状态信息:
- 通过yaml脚本创立K8S资源:
- 查看K8S中所有Pod的状态信息,通过更多按钮能够查看容器日志和执行外部命令。
总结
当咱们的利用须要部署在多个物理机上时,传统的做法是一个个物理机器去部署。如果咱们应用了K8S的话,就能够把这些物理机认为是一个集群,只需通过K8S把利用部署到集群即可,无需关怀物理机的部署细节。同时K8S提供了程度扩容、主动装箱、主动修复等性能,大大减少了利用集群化部署的工作量。
参考资料
官网文档:https://kubernetes.io/zh/docs...
本文 GitHub https://github.com/macrozheng/mall-learning 曾经收录,欢送大家Star!