minikube 是什么
minikube 可以理解为一个可以运行在本地的,单节点的 Kubernetes,我们可以通过在里面创建 Pods 来创建对应的服务
kubernetes 是什么
Kubernetes 是容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。
minikube 安装
MAC
brew install minikube
Linux
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
详细安装见 官方文档
查看安装是否成功
➜ ~ minikube version
minikube version: v1.17.1
commit: 043bdca07e54ab6e4fc0457e3064048f34133d7e
minikube 环境搭建
- 启动 minikube
➜ ~ minikube start
😄 Darwin 10.15.7 上的 minikube v1.17.1
✨ 根据现有的配置文件使用 docker 驱动程序
👍 Starting control plane node minikube in cluster minikube
🔄 Restarting existing docker container for "minikube" ...
🐳 正在 Docker 20.10.2 中准备 Kubernetes v1.20.2…
🔎 Verifying Kubernetes components...
🌟 Enabled addons: default-storageclass, storage-provisioner, dashboard
🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
- 执行 kubectl 相关命令
➜ ~ kubectl get node
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane,master 149m v1.20.2
- 部署应用
#创建一个名为 hello-minikube 的 deployment,运行 k8s.gcr.io/echoserver:1.4 这个镜像
kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.4
#为 deployment 的 hello-minikube 创建 service,指定 service 类型为 NodePort ,并绑定 8080 端口
kubectl expose deployment hello-minikube --type=NodePort --port=8080
Kubectl 常用命令详解:http://docs.kubernetes.org.cn/535.html
- 查看 service 是否创建成功
kubectl get services hello-minikube
- 访问 service
minikube service hello-minikube
- Loadbalancer 部署
kubectl create deployment balanced --image=k8s.gcr.io/echoserver:1.4
kubectl expose deployment balanced --type=LoadBalancer --port=8080
service 的类型
- ClusterIP:默认类型,自动分配一个仅Cluster内部可以访问的虚拟IP
- NodePort:在ClusterIP基础上为Service在每台机器上绑定一个端口,外部可以通过NodeIP:NodePort来访问该服务
- LoadBalancer:在NodePort的基础上,借助cloud provider创建一个外部负载均衡器,并将请求转发到NodeIP:NodePort
- ExternalName:把集群外的服务引入到集群内部,在集群内部直接使用
- 查看仪表盘
仅获取仪表盘URL
minikube dashboard --url
直接跳转
➜ ~ minikube dashboard
🤔 正在验证 dashboard 运行情况 ...
🚀 Launching proxy ...
🤔 正在验证 proxy 运行状况 ...
🎉 Opening http://127.0.0.1:63251/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/ in your default browser...
可以看到如下展示
minikube 的使用
重点介绍以下三点:
deployment
官方介绍
Deployment 为 Pod 和 Replica Set 提供声明式更新。 我们只需要在 Deployment 中描述想要的目标状态是什么,Deployment Controller 就会帮我们将 Pod 和ReplicaSet 的实际状态改变到您的目标状态。
具体表现为
定义一组 Pod 期望数量,Deployment Controller 会维持 Pod 数量与期望数量一致
配置 Pod 的发布方式,Deployment Controller 会按照给定的策略更新 Pod,保证更新过程中不可用 Pod 维持在限定数量范围内
如果发布有问题支持回滚
deployment 原理
Kubernetes 中有一个 kube-controller-manager
的组件,是控制器的集合,每一个控制器负责某种编排功能,deployment 是控制器中的一种
可以简单的这样描述:
for {
实际状态 := 获取集群中对象X的实际状态
期望状态 := 获取集群中对象X的期望状态
if 实际状态 == 期望状态 {
什么都不做
}else{
执行编排动作,将实际状态调整为期望状态
}
}
实际状态:往往来自于 Kubernetes 集群本身。比如 Kubelet 通过心跳汇报的容器状态和节点状态,或者监控系统中保存的应用监控数据,或者控制器主动收集的它感兴趣的信息,这些都是常见的实际状态的来源;
期望状态:一般来自用户提交的 YAML 文件,这些信息都保存在 Etcd 中
例如:
- Deployment Controller 会从 Etcd 中获取到所有携带 “app:xxx”标签的 Pod,然后统计它们的数量,这是实际状态
- Deployment 对象的 replicas 的值是期望状态 Deployment
- Controller 会将两个状态做比较,然后根据比较结果,确定是创建新的 Pod,还是删除已有 Pod
deployment 实验练习
编写 yaml 文件如下:
➜ cat deploy_nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.12.2
ports:
- containerPort: 80
根据 deploy_nginx.yml 创建 deployment
➜ kubectl create -f deploy_nginx.yml
deployment.apps/nginx-deployment created
查看 deployment 的创建情况
➜ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
balanced 1/1 1 1 3h49m
hello-minikube 1/1 1 1 3h58m
nginx-deployment 0/3 3 0 18s
deployment 的创建需要一些时间
➜ deployment kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
balanced 1/1 1 1 4h
hello-minikube 1/1 1 1 4h10m
nginx-deployment 3/3 3 3 11m
查看ReplicaSet
kubectl get rs
➜ kubectl get rs
NAME DESIRED CURRENT READY AGE
balanced-5744b548b4 1 1 1 3h49m
hello-minikube-6ddfcc9757 1 1 1 3h59m
nginx-deployment-84b8bdb667 3 3 3 39s
查看所有 prod 信息
➜ kubectl get pods
NAME READY STATUS RESTARTS AGE
balanced-5744b548b4-bl69g 1/1 Running 1 3h50m
hello-minikube-6ddfcc9757-b8976 1/1 Running 1 3h59m
nginx-deployment-84b8bdb667-44j9w 1/1 Running 0 67s
nginx-deployment-84b8bdb667-rh2mm 1/1 Running 0 67s
nginx-deployment-84b8bdb667-xvpmh 1/1 Running 0 67s
查看 deployment 的详细信息
➜ kubectl get deployment -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
balanced 1/1 1 1 5h59m echoserver k8s.gcr.io/echoserver:1.4 app=balanced
hello-minikube 1/1 1 1 6h8m echoserver k8s.gcr.io/echoserver:1.4 app=hello-minikube
nginx-deployment 3/3 3 3 129m nginx nginx:1.12.2 app=nginx
暴露端口
➜ kubectl expose deployment nginx-deployment --type=NodePort
service/nginx-deployment exposed
可看到暴露的端口为 31895
➜ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
balanced LoadBalancer 10.107.151.143 127.0.0.1 8080:30881/TCP 6h4m
hello-minikube NodePort 10.106.207.87 <none> 8080:30386/TCP 6h13m
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6h28m
nginx-deployment NodePort 10.110.56.122 <none> 80:31895/TCP 16s
进入 minikube 查看 ip 地址
➜ deployment minikube ssh
docker@minikube:~$ ls
docker@minikube:~$ ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
3: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN group default qlen 1000
link/tunnel6 :: brd ::
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:58:d5:a5:21 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
访问成功
docker@minikube:~$ curl 172.17.0.1:31895
<!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>
yaml 文件详解
yaml 文件包含四个部分:
apiVersion: 表示版本
kind: 表示资源
metadata: 表示元信息
spec: 资源规范字段
eg:
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo
namespace: default
labels:
app: demo
version: stable
spec:
replicas: 1
revisionHistoryLimit: 3
selector:
matchLabels:
app: demo
version: stable
strategy:
rollingUpdate:
maxSurge: 30%
maxUnavailable: 30%
type: RollingUpdate
template:
metadata:
annotations:
sidecar.istio.io/inject: "false"
labels:
app: demo
version: stable
spec:
containers:
- name: demo
image: demo:v1
imagePullPolicy: IfNotPresent
resources:
limits:
cpu: 300m
memory: 500Mi
requests:
cpu: 100m
memory: 100Mi
livenessProbe:
httpGet:
path: /healthCheck
port: 8080
scheme: HTTP
initialDelaySeconds: 30
timeoutSeconds: 5
periodSeconds: 30
successThreshold: 1
failureThreshold: 5
readinessProbe:
httpGet:
path: /healthCheck
port: 8080
scheme: HTTP
initialDelaySeconds: 30
timeoutSeconds: 5
periodSeconds: 10
successThreshold: 1
failureThreshold: 5
ports:
- name: http
containerPort: 8080
protocol: TCP
imagePullSecrets:
- name: harbor-certification
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: beta.kubernetes.io/arch
operator: In
values:
- amd64
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)