k8s架构
Master节点构成
master节点相当于大脑。
Worker节点
- container runtime:k8s不直接和容器对接,而是通过container runtime来做处理,当镜像没有的时候会去拉取,然后缓存在本地。
- kube-proxy:管理service网络,pod的ip是瞬息万变的,为了屏蔽pod ip的变化,所以引入了service的概念,并且在调用的时候进行负载均衡
发布流程
- 发布命令,创建一个副本,通知ControllerManager
- ControllerManager会比较当前环境和预发布的环境,是否一致,创建pod
- 通知Scheduler
- Scheduler会把pod调度到可用的节点上,通知节点上的Kubelet
- Kubelet指示ContainerRuntime去拉取镜像,运行镜像
总体架构
组件
启动minikube
appledeMacBook-Pro:~ apple$ minikube start
😄 Darwin 10.13.6 上的 minikube v1.16.0
✨ 根据现有的配置文件使用 hyperkit 驱动程序
👍 Starting control plane node minikube in cluster minikube
🔄 Restarting existing hyperkit VM for "minikube" ...
🎉 minikube 1.18.1 is available! Download it: https://github.com/kubernetes/minikube/releases/tag/v1.18.1
💡 To disable this notice, run: 'minikube config set WantUpdateNotification false'
🐳 正在 Docker 20.10.0 中准备 Kubernetes v1.20.0…
🔎 Verifying Kubernetes components...
🌟 Enabled addons: default-storageclass, storage-provisioner, dashboard
❗ /usr/local/bin/kubectl is version 1.16.6-beta.0, which may have incompatibilites with Kubernetes 1.20.0.
▪ Want kubectl v1.20.0? Try 'minikube kubectl -- get pods -A'
🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
appledeMacBook-Pro:~ apple$ minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
timeToStop: Nonexistent
appledeMacBook-Pro:~ apple$ kubectl version --client
Client Version: version.Info{Major:"1", Minor:"16+", GitVersion:"v1.16.6-beta.0", GitCommit:"e7f962ba86f4ce7033828210ca3556393c377bcc", GitTreeState:"clean", BuildDate:"2020-01-15T08:26:26Z", GoVersion:"go1.13.5", Compiler:"gc", Platform:"darwin/amd64"}
appledeMacBook-Pro:~ apple$ kubectl config current-context
minikube
appledeMacBook-Pro:~ apple$
appledeMacBook-Pro:~ apple$ kubectl get no
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane,master 110d v1.20.0
appledeMacBook-Pro:~ apple$ kubectl version
Client Version: version.Info{Major:"1", Minor:"16+", GitVersion:"v1.16.6-beta.0", GitCommit:"e7f962ba86f4ce7033828210ca3556393c377bcc", GitTreeState:"clean", BuildDate:"2020-01-15T08:26:26Z", GoVersion:"go1.13.5", Compiler:"gc", Platform:"darwin/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"}
appledeMacBook-Pro:~ apple$
appledeMacBook-Pro:~ apple$ kubectl cluster-info # 集群信息
Kubernetes master is running at https://192.168.64.2:8443
KubeDNS is running at https://192.168.64.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
appledeMacBook-Pro:~ apple$
Pod
一般一个Pod 里面住着一个容器
创建一个pod(以rabbitmq为例)
先定义pod的yaml文件
apiVersion: v1
kind: Pod
metadata:
name: rabbitmq-pod
spec:
containers:
- name: rabbitmq-container
image: rabbitmq:management
创建pod
appledeMacBook-Pro:k8s apple$ kubectl get pods
NAME READY STATUS RESTARTS AGE
rabbitmq-pod 1/1 Running 0 9s
appledeMacBook-Pro:k8s apple$ kubectl describe pod rabbitmq-pod #可查看pod详细信息,包括pod创建的一个流程,通过事件查看
网络访问
创建完成后,通过地址访问不到。我们得创建Service。
Service
创建Service
apiVersion: v1
kind: Service
metadata:
name: rabbitmq-svc
spec:
ports:
- name: rabbitmq-dashboard-http
port: 15672 # 暴露出来的地址
targetPort: 15672 # 应用真实的地址, 可以不写,默认和port一致
nodePort: 31035 #在本地开启31035的端口 将service暴露出来
selector:
app: rabbitmq #路由选择,标签为rabbitmq的应用 所以得修改pod上发布物yaml,将其打上标签
type: NodePort
修改pod的yaml,加上标签,可以路由过来
apiVersion: v1
kind: Pod
metadata:
name: rabbitmq-pod
labels: # 打标签
app: rabbitmq #用于service路由到这里
spec:
containers:
- name: rabbitmq-container
image: rabbitmq:management
访问
输入<minikube.ip>:31035
随即访问成功。