在学习k8s的过程中,不可避免的需要自己动手做实验,通常k8s需要3台机器,一台作为master节点,另外两个作为node节点,我以前不知道有minikube的时候,每次开3台虚拟机,这对电脑要求是比较高,同时也不方便,这种3台的集群搭建起来也更麻烦和耗时,建议大家在学习k8s的时候就用minikube来做实验,像istio、knative和kubevela都可以在minikube上运行。
注意:k8s和minikube的前提都是已经安装了docker
minikube安装
安装kubectl
先安装依赖的软件
apt update
apt install -y apt-transport-https
复制代码
下载并添加key
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
复制代码
上面命令中最后有个-
,这个意思是apt-key add
命令的参数来源自管道符左边的输出(即标准输出流),管道左边是curl
这个命令是获取远程资源文件的内容并输出到标准输出流,这些可以参考我之前发的《Linux必会命令》和《Shell基础》
添加apt源,其中kubernetes-xenial
的xenial
要和自己操作系统的内核保持一致
cat > /etc/apt/sources.list.d/kubernetes.list << EOF
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
复制代码
开始安装
apt update
apt install kubectl
复制代码
下载minikube
前往github搜索minikube,第一个就是,进入release页面,找自己需要的版本下载,下载链接如下(这是1.16.0版本):
下载好之后解压、添加权限并移到bin目录
chmod u+x minikube
mv minikube /usr/local/bin/
复制代码
到这已经下载配置完毕
启动并下载镜像
minikube start --image-mirror-country=cn --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --kubernetes-version=v1.18.3 --vm-driver=none
复制代码
minikube start
启动一个minikube--image-mirror-country=cn
指定镜像源国家,cn
表示中国--image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers
指定镜像源,这里设置的是阿里云--kubernetes-version=v1.18.3
指定k8s版本,这个版本要看我们下载的minikube版本支持哪些k8s版本,这种官网肯定都有,自己找一下,我的minikube版本v1.16.0支持k8s版本v1.18.3--vm-driver=none
不创建虚拟机--memory=2048mb
指定使用多大内存
执行命令后要等很长一段时间,minikube在下载k8s所需要的镜像和kubelet以及kubeadm,我们指定了镜像源,否则在国内下载不了gcr仓库的镜像。
当终端上提示Done! kubectl is now configured to use ...
的时候就启动成功了,下一次再执行minikube start时就很快了
注意:指定--vm-driver=none
时需要安装操作系统中已经安装conntrack
,否则会报requires conntrack
的错误
apt install conntrack
复制代码
相关命令
minikube的常用命令如下:
命令 | 说明 |
---|---|
minikube -h | 查看minikube命令帮助 |
minikube start | 启动 |
minikube stop | 停止,启动后可通过这个命令关闭 |
minikube delete | 删除 |
minikube dashboard | 启动dashboard,在k8s中dashboard还要自己通过helm安装,在minikube中一个命令就可以,很方便 |
对于minikube dashboard命令启动dashboard后,在本机之外是访问不到的,需要通过kubectl proxy
设置代理,如下:
kubectl proxy --port=8001 --address='服务器IP' --accept-hosts='^.*' &
复制代码
访问dashboard:http://服务器IP:8001/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/#/overview?namespace=default
kubectl
kubectl是我们管理k8s最常用的命令,所以在体验minikube之前也要了解这个命令的用法,这个命令的子命令非常多,以下只能列出一些常用的,更多的命令可通过help查看
get
用于查看所有服务和资源
命令 | 说明 |
---|---|
kubectl get ns | 查看所有命名空间 |
kubectl get all | 查看指定命名空间下的所有服务,通过-n 指定命名空间,如kubectl get all -n kube-system ,以下都可以通过-n 来指定命名空间 |
kubectl get po | 查看指定命名空间下的所有pod,默认是default命名空间,可通过-w 来监听变化,通常用于查看新的pod是否启动成功,可通过--show-labels 查看各个pod的标签 |
kubectl get svc | 查看service |
kubectl get cm | 查看config map |
所有的查看命令都可以直接指定具体的服务名(资源名),精确的查找到某一个,再指定-o
来输出详情,如下:
// 查看kube-system命名空间下,叫xxx的pod,并输出为yaml格式
kubectl get po -n kube-system xxx -o yaml
复制代码
apply
用于应用yaml文件
kubectl apply -f xxx.yml
复制代码
在yaml文件中可以定义各种资源,如namespace, configmap, service, deployment, replicaset等,对于这种yaml文件执行apply子命令就可以了,不用自己一个一个去创建
create
用于创建服务和资源
命令 | 说明 |
---|---|
kubectl create ns xxx | 创建以xxx 命名的命名空间 |
kubectl create cm xxx –from-file=yyy | 创建ConfigMap,--from-file=yyy 这个参数是可选项(不指定也可以创建成功),如果指定则yyy可以是文件也可以是目录,如果是目录,则加载目录下所有配置文件,以文件名为key,以文件内容为值 |
kubectl create secret tls xxx | 创建Secret,如kubectl create secret tls xxx --key xxx.key --cert xxx.crt ,其中tls是secret的类型,xxx为secret名称 |
edit
用于编辑已经存在的服务和资源
命令 | 说明 |
---|---|
kubectl edit cm xxx | 编辑xxx这个ConfigMap |
delete
用于删除已经存在的服务和资源
命令 | 说明 |
---|---|
kubectl delete ns xxx | 删除xxx这个命名空间 |
kubectl delete po xxx | 删除xxx这个pod,可通过-n 指定命名空间 |
kubectl delete po –all | 删除指定命名空间下的所有pod,其他如svc、deployment、rs等都可以–all删除全部 |
kubectl delete svc xxx | 删除service |
kubectl delete rs xxx | 删除ReplicaSet |
kubectl delete -f xxx.yml | 通过yaml文件来删除,这种删除方式是最常用的,在使用k8s的时候一定要注意把yaml文件备份好 |
删除子命令还有很多就不一一列举了,都是指定要删除什么类型的服务,再指定名称和命名空间即可
describe
查看详细信息,经常在pod启动失败时用来查看原因,比如镜像下载失败等
kubectl describe po -n kube-system xxx
复制代码
logs
查看pod的日志,也可以查看pod中指定容器的日志,通常用来查找具体问题,如网络不通和程序输出的日志等
kubectl logs -n kube-system xxx
kubectl logs -n kube-system xxx -f
复制代码
指定容器,通过-c
指定pod中的容器名,c是container的意思
kubectl logs -n kube-system xxx -f -c yyy
复制代码
初体验之部署nginx
现在来动手实现一个nginx的部署,体验一下超长的yaml
以下是nginx的yaml文件,需要一个Deployment和一个Service
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-v1
spec:
replicas: 1
selector:
matchLabels: # 新版本中这个属性是必须的,用来匹配下面template中定义的metadata.labels
name: nginx
version: v1
template:
metadata:
# 给pod添加标签,这里分别添加了name=nginx, version=v1这两个标签
labels:
name: nginx
version: v1
spec:
containers:
- name: nginx # 容器名
image: nginx # 镜像
imagePullPolicy: IfNotPresent # 镜像拉取的策略,IfNotPresent表示如果本地没有就从仓库拉取新的镜像
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
# Service的类型
type: ClusterIP
# 通过selector选择pod
selector:
name: nginx
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
复制代码
以上的yaml文件中定义了一个Deployment和一个Service,其中Deployment负责部署pod,spec.template
就是pod的定义,而spec.replicas
设置需要部署几个nginx的pod
Service中spec.selector
用于选择pod,只要pod的标签中有name=nginx即可被选中,这样正好可以选中上面Deployment部署的nginx的各个pod,如果pod有多个,就自动实现了负载均衡,不过这种负载均衡实现的效果并不好,以后要用其他方案来代替
创建以上的yaml文件后,执行命令应用到k8s上,默认是安装在default命名空间下,具体装到哪个命名空间下,可在yaml文件中metadata下指定namespace
kubectl apply -f xxx.yml
复制代码
之后可通过kubectl命令查看
kubectl get po
kubectl get deployment
kubectl get svc
复制代码
其中kubectl get svc
可查看到IP,可以直接curl这个IP查看nginx是否有响应
kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 171d
nginx ClusterIP 10.108.164.139 <none> 80/TCP 9m40s
curl 10.108.164.139
复制代码
curl输出nginx的欢迎页面就说明部署成功了,只是目前在本机外部还访问不了,这个以后再说
删除nginx部署:
kubectl delete -f xxx.yml
复制代码
再强调一句:k8s中yaml文件全留着,启动和删除都可通过yaml文件来实现
docker-compose.yml转换
k8s的yaml文件都很长,平时自己也有很多docker-compose.yml文件,如果能够有一个工具将docker-compose.yml转成k8s的yaml就很方便了,k8s就提供了这样一个工具,叫kompose
安装kompose
从kompose的github上下载,链接 是https://github.com/kubernetes/kompose/releases
,下载适合自己操作系统的压缩包,解压后得到一个可执行文件,将其移到bin目录下
mv kompose-linux-amd64 /usr/local/bin/
复制代码
接下来就可以进行转换了,先准备一个简单的docker-compose.yml
version: '3.1'
services:
nginx:
restart: always
image: nginx
container_name: nginx
ports:
- 80:80
复制代码
进入该docker-compose.yml文件所在目录下执行转换
kompose-linux-amd64 convert
复制代码
转换成功后就会得到一些k8s的yaml文件,比自己手写快多了