16 视频:初级篇实操总结
你好,我是Chrono。
学完了前面的7节文字+音频的课程之后,今天又是一节视频课程,对“初级篇”里Kubernetes知识做一个回顾与总结,同样还是注重实际操作的演示,而不会讲解理论知识。
首先我们会启动本机环境里的minikube,登录虚拟节点看看apiserver、etcd、scheduler等组件,然后使用命令行工具kubectl操作Kubernetes,创建Pod、Job、CronJob、ConfigMap、Secret等API对象。
接下来我们视频上见。
一. minikube环境
视频操作要点:
我们从minikube环境开始,安装的过程就不演示了,我假设你已经按照第9讲里的步骤成功下载了minikube和kubectl的二进制文件。
先看一下minikube的版本号:
显示的是当前的最新版本1.25.2,再看一下它的状态:
可以看到Kubernetes的组件都没有启动,集群处于停止状态。
现在让我们用 minikube start
启动minikube集群:
稍等一小会,看看它提示里的表情符号,一个本地的微型Kubernetes集群就创建好了。从提示信息里可以看到,这个Kubernetes集群的版本是v1.23.3,运行在Docker 20.10.12上。
现在我们再看一下minikube的状态:
可以看到Kubernetes的核心组件kubelet、apiserver都是运行状态了。
命令 minikube node list
可以查看这个微型集群的节点列表:
默认情况下,minikube只会创建一个节点,这里显示它的IP地址是“192.168.49.2”。
我们可以使用命令 minikube ssh
直接登录到这个节点,是虚拟机里的一个虚拟机,在里面可以执行任意的Linux操作:
uname -a #显示是Ubuntu操作系统
docker version #这个节点里也跑了一个docker,但其实是复用了宿主机的docker
docker ps #能够看到节点里以容器形式运行的Kubernetes进程,比如pause、scheduler等等
exit
看完了minikube集群的状态,让我们用kubectl来操作Kubernetes,首先是看版本号:
显示版本是1.23.3。用 kubectl get pod
看看当前集群里运行的运行应用,会发现是空的。
让我们用 run
命令运行一个Nginx Pod:
这个时候我们再查看Pod, kubectl get pod
就会看到有一个Pod运行了。
这个Nginx pod属于default名字空间,而apiserver等核心组件是在kube-system名字空间,你可以用 -n
参数查看在kube-system里运行的Pod:
可以看到apiserver、etcd、scheduler、controller manager、coredns、kube-proxy等组件都是以Pod的形式在这里运行。
二. 用kubectl操作API对象
视频操作要点:
下面我们把注意力集中在kubectl操作Kubernetes API对象上。
先来查看当前Kubernetes版本支持的所有api对象,命令是 kubectl api-resources
:
它的输出信息很多,你可以看到Pod的简写是po、api version是v1、CronJob的简写是cj、api version是batch/v1,这些信息在我们编写YAML描述文件的时候非常有用。
再来看另一个常用的命令 kubectl explain
,它能够给出api对象字段的详细信息,比如查看Pod:
kubectl explain pod
kubectl explain pod.metadata
kubectl explain pod.spec
kubectl explain pod.spec.containers
有了这个随手可得的文档,我们在编写YAML文件的时候就不会不知所措了。
创建YAML样板要用到两个特殊参数“--dry-run=client”和“-o yaml”,我把它定义成一个环境变量:
然后我们再创建一个Pod的YAML:
用vi编辑这个文件,删除不需要的字段,一个YAML描述文件形式的API对象就创建好了。
三. Pod对象
视频操作要点:
我们来看一个已经编辑好的Nginx pod对象,里面定义了名字是ngx-pod,有两个标签env和owner,spec里的containers定义了Pod里只有一个容器,镜像是nginx:alpine,对外的端口是80。
现在就可以使用命令 kubectl apply
创建这个Pod,再用 kubectl get pod
来查看状态:
命令 kubectl logs
会输出Nginx的运行日志:
我们还可以用 kubectl exec
进入Pod里的容器,注意要有 --
:
最后我们用 kubectl delete
删除这个Pod:
四. 离线业务对象Job、CronJob
视频操作要点:
看完了Pod的基本操作之后,我们来看离线业务的对象Job和CronJob。
首先要用 kubectl create
创建一个Job样板文件:
把它保存编辑之后,我们就得到了一个Job对象,用vi看一下。这个Job非常简单,执行echo命令,输出hello world。注意它的restartPolicy是OnFailure,表示失败后要原地重启容器。
现在来创建Job对象,用的命令还是 kubectl apply
:
创建之后用 kubectl get job
、kubectl get pod
来分别查看Job和Pod的状态,使用命令 kubectl logs
来获取Pod的运行结果:
CronJob同样也可以自动生成样板文件:
CronJob对象里要注意的是,它使用jobTemplate又定义了一个Job,然后在字段schedule里使用cron语法定义了定时运行的规则,这里就是每分钟运行一次。
CronJob的用法和Job几乎是一样的,用 apply
命令创建后就可以用get来查看作业的运行状态:
最后让我们用 delete
命令删除这两个API对象:
五. 配置信息对象ConfigMap和Secret
视频操作要点:
下面我来演示Kubernetes里的配置信息对象ConfigMap和secret。
还是老办法,先用 kubectl create
创建ConfigMap的样板文件,不过要命令后面多加一个参数 --from-literal
,从字面值生成一些数据:
Secret也是同样的创建方式,注意命令形式与ConfigMap略有不同,要用generic表示一般的机密信息:
我们来看看已经编辑好的YAML文件:
这里定义了4个配置项,注意ConfigMap要求必须是字符串,所以最好用引号引起来,避免解释成数字导致错误。
Secret里定义了3个配置项,由于做了base64编码,不能直接看到原值,不过我们可以在命令行里用工具base64 -d解码,比如看用户名:
现在让我们创建这两个对象:
然后查看这些对象的状态:
ConfigMap是明文显示:
而Secret的类型是Opaque,不透明的,不能直接看到。
接下来我们把这些配置信息以存储卷的形式注入Pod,需要在Pod里加入“volumes”和“volumeMounts”字段:
在这份YAML里,我为ConfigMap和Secret定义了两个volume,分别是cm-vol和sec-vol,然后在volumeMounts里把它们挂载到了tmp目录。
用 kubectl apply
命令创建之后,我们还是用 kubectl exec
进入Pod,看看配置信息被加载成了什么形式:
kubectl apply -f vol-pod.yml
kubectl get pod
kubectl exec -it vol-pod -- sh
cd /tmp
ls #加载成两个目录
cd cm-items/
cat greeting
cd ..
cd sec-items/
cat pwd #已经被base64解码
六. 在Kubernetes里搭建WordPress
视频操作要点:
最后我们在Kubernetes里搭建WordPress,这些YAML文件都已经准备好了,只需要逐个用 apply
命令创建就可以。
首先是MariaDB数据库:
需要看它的IP地址,这里是172.17.0.?,然后我们修改WordPress YAML,环境变量host改成MariaDB的地址,然后再创建WordPress Pod:
现在这两个Pod都已经正常运行了,我们需要把WordPress的端口暴露出来,用的是 kubectl port-forward
命令:
然后我们用Docker运行Nginx容器,代理这个端口:
现在我们打开Mac上的Safari浏览器,输入虚拟机的IP地址“http://192.168.10.208”,就可以看到WordPress的安装界面了。
课下作业
今天是动手操作课,记得让自己实际上手操作一遍,毕竟看一遍和写一遍学习效果完全不同哦。
欢迎分享自己的学习体验和疑问,在留言区参与讨论。我们下节课见。
- SuperSu 👍(3) 💬(1)
仓库地址:https://github.com/chronolaw/k8s_study
2022-07-29 - 美妙的代码 👍(2) 💬(1)
nginx 代理8080怎么不用k8s跑, 是因为docker 网络host模型方便吗?
2022-10-21 - 恰饭哒 👍(1) 💬(1)
mariadb-pod.yml有人可以给这几个yaml的文件码,谢谢大佬太难了
2023-04-09 - vivi 👍(1) 💬(4)
export out="--dry-run=client -o yaml" 这个会报错:error: Invalid dry-run value (client -o yaml). Must be "none", "server", or "client".
2022-09-21 - 花花大脸猫 👍(1) 💬(1)
启动dashboard的时候,出现:Exiting due to HOST_KUBECTL_PROXY: proxy start: fork/exec /usr/local/bin/kubectl: exec format error,通过官方的issue(https://github.com/kubernetes/minikube/issues/5256)解决处理
2022-08-02 - Geek_7e25fd 👍(1) 💬(1)
我在启动minikube集群时,卡在了pulling base image,这个该如何解决呀?
2022-08-01 - Geek_f09d5e 👍(1) 💬(2)
wp_proxy.sh 文件内容是什么
2022-07-29 - 张仁(信息中心) 👍(1) 💬(1)
都好,就嫌弃太慢了(指的人极客,不是老师)
2022-07-27 - Geek_515a78 👍(0) 💬(2)
kubectl apply -f mariadb-pod.yml后,我拉不起来这个容器,显示下载失败,我是用github上面的yml文件
2024-06-09 - Geek_07ead6 👍(0) 💬(1)
老师,yaml文件哪里有各个对象的全字段结构示例可以参考吗?
2024-03-19 - Geek_000c13 👍(0) 💬(1)
文中代码部分: `docker version #这个节点里也跑了一个docker,但其实是复用了宿主机的docker`。 有个疑问,minikube运行的kicbase里运行的docker,跟宿主机运行的docker是互不影响的关系,不是复用的关系吧? 我在宿主机执行docker version,和minikube节点里执行docker version,版本是不同的,docker images也是完全不同的。
2024-02-07 - ... 👍(0) 💬(1)
老师,这里将pod端口映射成本地端口8080了,为啥还要搞个nginx代理?这样用的目的是什么啊
2022-12-14 - 美妙的代码 👍(0) 💬(1)
kubectl port-forward 是怎么把宿主机端口8080 映射到了word-pod 80 ? 如果后面的db-pod, address变了怎么办,所以后面就用service 好些吧
2022-10-21