系统环境-deepin15.11
- 安装virtualbox虚拟机:应用商店就有
- 安装minikube
aizhao@aizhao:~/hellonode$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 82.3M 100 82.3M 0 0 4295k 0 0:00:19 0:00:19 --:--:-- 4896k
- 安装kubectl
aizhao@aizhao:~/hellonode$ curl -Lo kubectl https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl && chmod +x kubectl
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 68.9M 100 68.9M 0 0 4756k 0 0:00:14 0:00:14 --:--:-- 5385k
aizhao@aizhao:~/hellonode$ sudo mv kubectl /usr/local/bin/
- 配置信息
aizhao@aizhao:~/hellonode$ export MINIKUBE_WANTUPDATENOTIFICATION=false
aizhao@aizhao:~/hellonode$ export MINIKUBE_WANTREPORTERRORPROMPT=false
aizhao@aizhao:~/hellonode$ export MINIKUBE_HOME=$HOME
aizhao@aizhao:~/hellonode$ export CHANGE_MINIKUBE_NONE_USER=true
aizhao@aizhao:~/hellonode$ mkdir $HOME/.kube || true
aizhao@aizhao:~/hellonode$ touch $HOME/.kube/config
aizhao@aizhao:~/hellonode$ export KUBECONFIG=$HOME/.kube/config
- 启动minikube
aizhao@aizhao:~/hellonode$ minikube start - driver=virtualbox
- 查看minikube启动状态
aizhao@aizhao:~/hellonode$ minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
- 进入minikube虚拟机,修改密码,这样你既可以在终端登录,也可以在virtualbox的minikube里面登录:默认用户名docker
aizhao@aizhao:~/hellonode$ minikube ssh
_ _
_ _ ( ) ( )
___ ___ (_) ___ (_)| |/') _ _ | |_ __
/' _ ` _ `\| |/' _ `\| || , < ( ) ( )| '_`\ /'__`\
| ( ) ( ) || || ( ) || || |\`\ | (_) || |_) )( ___/
(_) (_) (_)(_)(_) (_)(_)(_) (_)`\___/'(_,__/'`\____)
$ pwd
/home/docker
$ sudo passwd docker
Changing password for docker
New password:
minikube的kubernetes第一个应用
- 创建hellonode文件夹
- 在该文件夹里面创建server.js编写代码
-
var http = require('http'); var handleRequest = function(request, response) { console.log('Received request for URL: ' + request.url); response.writeHead(200); response.end('Hello World!'); }; var www = http.createServer(handleRequest); www.listen(8080);
- 如果本地系统安装了node,可以使用命令运行 node service.js,可以在http:// localhost:8080 / 中查看到“Hello World!”消息。
-
按Ctrl-C停止正在运行的Node.js服务器。下一步将应用程序打包到Docker容器中。
-
在hellonode文件夹创建文件Dockerfile文件,内容如下
-
FROM node:6.9.2 EXPOSE 8080 COPY server.js . CMD node server.js
-
本教程使用Minikube,而不是将Docker镜像push到registry,可以使用与Minikube VM相同的Docker主机构建镜像,以使镜像自动存在。为此,请确保使用Minikube Docker守护进程: (此操作保证docker命令使用的是minikube虚拟机里面的docker,而不是本地系统中的docker,可以从docker pull hello-world命令查看,镜像究竟是在本地系统docker images中还是minikube的docker images中)
aizhao@aizhao:eval $(minikube docker-env)
-
注意:如果不再使用Minikube主机时,可以通过运行eval $(minikube docker-env -u)来撤消此更改。
-
在hellonode文件夹中终端执行docker build -t hello-node:v1 .
-
则可以在minikube虚拟机中,通过docker images 看到hello-node:v1镜像
-
在hellonode文件夹中创建 hellonode-deployment.yaml文件,内容如下
-
apiVersion: apps/v1 kind: Deployment metadata: name: hellonode-deployment labels: app: hellonode spec: # 创建2个hellonode容器 replicas: 2 selector: matchLabels: app: hellonode template: metadata: labels: app: hellonode spec: containers: - name: hello-node image: hello-node:v1 ports: - containerPort: 8080
-
在hellonode文件夹终端下执行kubect apply -f hellonode-deployment.yaml
-
aizhao@aizhao:~/hellonode$ kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE hellonode-deployment 2/2 2 2 7m25s aizhao@aizhao:~/hellonode$ kubectl get pods NAME READY STATUS RESTARTS AGE hellonode-deployment-7c8944bfb6-qdz2l 1/1 Running 0 16m hellonode-deployment-7c8944bfb6-v4z8t 1/1 Running 0 10m aizhao@aizhao:~/hellonode$ kubectl describe pod hellonode-deployment-7c8944bfb6-qdz2l Name: hellonode-deployment-7c8944bfb6-95s2f Namespace: default Priority: 0 Node: minikube/1xx.1xx.xx.1xx这里是自己本地网络ip Start Time: Wed, 15 Jul 2020 15:37:18 +0800 Labels: app=hellonode pod-template-hash=7c8944bfb6 Annotations: <none> Status: Running IP: 172.17.0.6 IPs: IP: 172.17.0.6 Controlled By: ReplicaSet/hellonode-deployment-7c8944bfb6
-
这里你就可以在minikube虚拟机里面通过curl 172.17.0.6:8080访问了,查看到“Hello World!”消息。
-
默认情况,这Pod只能通过Kubernetes群集内部IP访问。要使hello-node容器从Kubernetes虚拟网络外部访问,须要使用Kubernetes Service暴露Pod。我们可以使用kubectl expose命令将Pod暴露到外部环境:
-
aizhao@aizhao:~/hellonode$ kubectl expose deployment hellonode-deployment --type=LoadBalancer
-
查看刚创建的Service:
-
aizhao@aizhao:~/hellonode$ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hellonode-deployment LoadBalancer 10.108.135.26 <pending> 8080:32583/TCP 14s kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 21h
-
aizhao@aizhao:~/hellonode$ minikube service hellonode-deployment |-----------|----------------------|-------------|-----------------------------| | NAMESPACE | NAME | TARGET PORT | URL | |-----------|----------------------|-------------|-----------------------------| | default | hellonode-deployment | 8080 | http://1xx.1xx.xx.xxx:32583 | |-----------|----------------------|-------------|-----------------------------| 🎉 正通过默认浏览器打开服务 default/hellonode-deployment... main.go:98: openScheme: "http", "http://1xx.1xx.xx.xxx:32583" main.go:107: desktop file: /usr/share/applications/google-chrome.desktop
- 这里你就可以通过url在浏览器里面访问了
- 通过minikube查看k8s应用
-
aizhao@aizhao:~/hellonode$ minikube dashboard 🔌 正在开启 dashboard ... 🤔 正在验证 dashboard 运行情况 ... 🚀 Launching proxy ... 🤔 正在验证 proxy 运行状况 ... 🎉 Opening http://127.0.0.1:36985/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/ in your default browser... main.go:98: openScheme: "http", "http://127.0.0.1:36985/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/" main.go:107: desktop file: /usr/share/applications/google-chrome.desktop
附:Deployment.yaml名词解释
apiVersion: apps/v1 # 指定api版本,此值必须在kubectl api-versions中
kind: Deployment # 指定创建资源的角色/类型
metadata: # 资源的元数据/属性
name: demo # 资源的名字,在同一个namespace中必须唯一
namespace: default # 部署在哪个namespace中
labels: # 设定资源的标签
app: demo
version: stable
spec: # 资源规范字段
replicas: 1 # 声明副本数目
revisionHistoryLimit: 3 # 保留历史版本
selector: # 选择器
matchLabels: # 匹配标签
app: demo
version: stable
strategy: # 策略
rollingUpdate: # 滚动更新
maxSurge: 30% # 最大额外可以存在的副本数,可以为百分比,也可以为整数
maxUnavailable: 30% # 示在更新过程中能够进入不可用状态的 Pod 的最大值,可以为百分比,也可以为整数
type: RollingUpdate # 滚动更新策略
template: # 模版
metadata: # 资源的元数据/属性
annotations: # 自定义注解列表
sidecar.istio.io/inject: "false" # 自定义注解名字
labels: # 设定资源的标签
app: demo
version: stable
spec: # 资源规范字段
containers:
- name: demo # 容器的名字
image: demo:v1 # 容器使用的镜像地址
imagePullPolicy: IfNotPresent # 每次Pod启动拉取镜像策略,三个选择 Always、Never、IfNotPresent
# Always,每次都检查;Never,每次都不检查(不管本地是否有);IfNotPresent,如果本地有就不检查,如果没有就拉取
resources: # 资源管理
limits: # 最大使用
cpu: 300m # CPU,1核心 = 1000m
memory: 500Mi # 内存,1G = 1000Mi
requests: # 容器运行时,最低资源需求,也就是说最少需要多少资源容器才能正常运行
cpu: 100m
memory: 100Mi
livenessProbe: # pod 内部健康检查的设置
httpGet: # 通过httpget检查健康,返回200-399之间,则认为容器正常
path: /healthCheck # URI地址
port: 8080 # 端口
scheme: HTTP # 协议
# host: 127.0.0.1 # 主机地址
initialDelaySeconds: 30 # 表明第一次检测在容器启动后多长时间后开始
timeoutSeconds: 5 # 检测的超时时间
periodSeconds: 30 # 检查间隔时间
successThreshold: 1 # 成功门槛
failureThreshold: 5 # 失败门槛,连接失败5次,pod杀掉,重启一个新的pod
readinessProbe: # Pod 准备服务健康检查设置
httpGet:
path: /healthCheck
port: 8080
scheme: HTTP
initialDelaySeconds: 30
timeoutSeconds: 5
periodSeconds: 10
successThreshold: 1
failureThreshold: 5
#也可以用这种方法
#exec: 执行命令的方法进行监测,如果其退出码不为0,则认为容器正常
# command:
# - cat
# - /tmp/health
#也可以用这种方法
#tcpSocket: # 通过tcpSocket检查健康
# port: number
ports:
- name: http # 名称
containerPort: 8080 # 容器开发对外的端口
protocol: TCP # 协议
imagePullSecrets: # 镜像仓库拉取密钥
- name: harbor-certification
affinity: # 亲和性调试
nodeAffinity: # 节点亲和力
requiredDuringSchedulingIgnoredDuringExecution: # pod 必须部署到满足条件的节点上
nodeSelectorTerms: # 节点满足任何一个条件就可以
- matchExpressions: # 有多个选项,则只有同时满足这些逻辑选项的节点才能运行 pod
- key: beta.kubernetes.io/arch
operator: In
values:
- amd64
Service.yaml名词解释
apiVersion: v1 # 指定api版本,此值必须在kubectl api-versions中
kind: Service # 指定创建资源的角色/类型
metadata: # 资源的元数据/属性
name: demo # 资源的名字,在同一个namespace中必须唯一
namespace: default # 部署在哪个namespace中
labels: # 设定资源的标签
app: demo
spec: # 资源规范字段
type: ClusterIP # ClusterIP 类型
ports:
- port: 8080 # service 端口
targetPort: http # 容器暴露的端口
protocol: TCP # 协议
name: http # 端口名称
selector: # 选择器
app: demo
pod.yaml名词解释
# yaml格式的pod定义文件完整内容:
apiVersion: v1 #必选,版本号,例如v1
kind: Pod #必选,Pod
metadata: #必选,元数据
name: string #必选,Pod名称
namespace: string #必选,Pod所属的命名空间
labels: #自定义标签
- name: string #自定义标签名字
annotations: #自定义注释列表
- name: string
spec: #必选,Pod中容器的详细定义
containers: #必选,Pod中容器列表
- name: string #必选,容器名称
image: string #必选,容器的镜像名称
imagePullPolicy: [Always | Never | IfNotPresent] #获取镜像的策略 Alawys表示下载镜像 IfnotPresent表示优先使用本地镜像,否则下载镜像,Nerver表示仅使用本地镜像
command: [string] #容器的启动命令列表,如不指定,使用打包时使用的启动命令
args: [string] #容器的启动命令参数列表
workingDir: string #容器的工作目录
volumeMounts: #挂载到容器内部的存储卷配置
- name: string #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
mountPath: string #存储卷在容器内mount的绝对路径,应少于512字符
readOnly: boolean #是否为只读模式
ports: #需要暴露的端口库号列表
- name: string #端口号名称
containerPort: int #容器需要监听的端口号
hostPort: int #容器所在主机需要监听的端口号,默认与Container相同
protocol: string #端口协议,支持TCP和UDP,默认TCP
env: #容器运行前需设置的环境变量列表
- name: string #环境变量名称
value: string #环境变量的值
resources: #资源限制和请求的设置
limits: #资源限制的设置
cpu: string #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
memory: string #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
requests: #资源请求的设置
cpu: string #Cpu请求,容器启动的初始可用数量
memory: string #内存清楚,容器启动的初始可用数量
livenessProbe: #对Pod内个容器健康检查的设置,当探测无响应几次后将自动重启该容器,检查方法有exec、httpGet和tcpSocket,对一个容器只需设置其中一种方法即可
exec: #对Pod容器内检查方式设置为exec方式
command: [string] #exec方式需要制定的命令或脚本
httpGet: #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
path: string
port: number
host: string
scheme: string
HttpHeaders:
- name: string
value: string
tcpSocket: #对Pod内个容器健康检查方式设置为tcpSocket方式
port: number
initialDelaySeconds: 0 #容器启动完成后首次探测的时间,单位为秒
timeoutSeconds: 0 #对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
periodSeconds: 0 #对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
successThreshold: 0
failureThreshold: 0
securityContext:
privileged:false
restartPolicy: [Always | Never | OnFailure]#Pod的重启策略,Always表示一旦不管以何种方式终止运行,kubelet都将重启,OnFailure表示只有Pod以非0退出码退出才重启,Nerver表示不再重启该Pod
nodeSelector: obeject #设置NodeSelector表示将该Pod调度到包含这个label的node上,以key:value的格式指定
imagePullSecrets: #Pull镜像时使用的secret名称,以key:secretkey格式指定
- name: string
hostNetwork:false #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
volumes: #在该pod上定义共享存储卷列表
- name: string #共享存储卷名称 (volumes类型有很多种)
emptyDir: {} #类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
hostPath: string #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
path: string #Pod所在宿主机的目录,将被用于同期中mount的目录
secret: #类型为secret的存储卷,挂载集群与定义的secre对象到容器内部
scretname: string
items:
- key: string
path: string
configMap: #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
name: string
items:
- key: string
path: string
参考文献:
http://docs.kubernetes.org.cn/126.html