zhangguanzhang's Blog

对于初入k8s和kubeadm的一些建议

字数统计: 2k阅读时长: 7 min
2018/11/24

主要还是简单说下kubeadm

说说一些现象

无论docker还是K8s群看见过太多人盲目了
有些是赶鸭子上来的,有的是跟风盲目进来乱学的.其中较多的分类为:

  • 不学docker直接学k8s的跟风狗
  • 没有熟悉Linux操作和一些基础知识的开发
  • Docker学得不怎么样就迫不及待来学的跟风狗

入门最具有争议的问题就是如何开始,k8s各个组件对于小白来说搭建方式和配置文件对于入门的人来说太庞大了,对于环境来学习一般分为下面两种

  • 按照别人博客或者文章去手动搭建一个环境后学习
  • 找个简易部署的方案来部署环境来学(kubeadm或者ansible之类的懒人搭建)

看过无数小白也怼过不少自以为是的人,大多觉得自己去手动搭建一套环境能学到一些k8s的东西
但是事实是根本学不到,类似于先有鸡还是先有蛋的哲学问题,搭建出错了或者别人搭建教程隐去了一些K8s的基础知识结果出错了不知道怎么排查
找群问因为不懂基础知识给了解决提醒他也听不懂,只有你帮他远程才能解决.举例这种头铁的人:

  • 文章里写了编辑/etc/fstab文件来关闭swap,结果他用sysctl关闭了.kubelet默认不配置选项下swap没关会起不来,他重启了一次后起不来也不会去看kubelet的log也不知道为啥要在/etc/fstab里注释
  • 按照一些写得详细的博客搭建起来确没学多少概念知识去staticPod目录去apply管理组件yml的
  • 按照权威指南搭建结果pod创建不了的(infra镜像是redhat的域名镜像仓库会无法拉取下来),不会用kubectl命令也不知道如何排查的
  • 按照老外或者台湾的博客搭建的,他们能直接拉到gcr.io的镜像,国内拉不到因为没学过k8s还有docker学得不怎么样也不会去看为啥一些起不来的

一些建议

建议入门使用一键部署或者kubeadm之类的,在一个现有环境上跟着官方文档来学习之后有空回头来找个较新的详细搭建文章去看,结合知道的知识去揣摩和自己搭建,相信此时比你盲目的莽会好很多

不得不说的kubeadm

关于镜像

kubeadm部署很方便,但是是一个老外写的,使用staticPod(容器)运行的管理组件,镜像都是gcr.io域名仓库里的。
域名仓库很多docker的人甚至都不知道,docker镜像命名规则是域名/namespace/img_name:tag这种形式,dockerhub上要拉取镜像直接是namespace/img_name:tag这种名字,是因为域名缺省是docker.io也就是dockerhub上看到的都是这个域名仓库的,
常见的域名仓库国外有gcr.io,quay.io,国内的阿里(registry.cn-hangzhou.aliyuncs.com,hangzhou以外还有shenzhen啥的),daocloud.io等等.gcr.io因为位置在国外会拉取不到.国内阿里仓库同步了gcr.io/google_containers这个namespaces下的镜像,但是亲测好个别没有。另外k8s.gcr.io=gcr.io/google_containers=gcr.io/google-containers,例如镜像gcr.io/google_containers/pause:3.0也可以用k8s.gcr.io/pause:3.0
使用kubeadm init的时候命令行有选项指定使用哪个仓库,也可以kubeadm init的时候指定运行参数的yml文件,在yml文件里指定域名仓库

关于kubeadm对于k8s组件这部分

说这个之前,总有人认为kubeadm的容器运行没有二进制运行放心.容器本身就是个隔离受限的进程,另外管理组件都是无状态的,但是他们总感觉不放心,你根本讲不过他们
除了kubelet以外所有组件都可以用容器方式运行,管理组件简单说下就是集群数据存放etcd数据库里,apiserver去和etcd交互,其他组件和apiserver交互,kubelet调用api去操作docker,其中一些组件也会去操作各个节点的系统设置
因为kubelet向apiserver交互的,apiserver又是容器,似乎陷入先有鸡还是先有蛋的僵局,一般是下面两种方式

  • docker run出各个管理组件
  • staticPod创建

第一种看过一些安装教程也有这样做的,不过大家都是强迫症,希望所有pod(容器)归k8s管理.staticPod是kubelet负责创建和删除,它会根据指定的目录或者url里的yml创建出pod不会被动从apiserver那收到请求去创建.只需要在staticPod定义的目录(默认是/etc/kubernetes/manifests/)放置pod的定义文件即可,这也是kubeadm使用的方法.kubeadm会创建etcd,kube-apiserver,kube-proxy,kube-controller-manager,kube-scheduler的pod
因为存在依赖关系和初始化,可能etcd没起来,apiserver起来了确连不上etcd导致apiserver的容器停止,因为kubelet会保证staticPod运行,所以最终肯定会起来的.可以通过docker ps -a查看和kubectl get cs来查看集群状态.起不来的话使用docker logs去看容器的log根据报错看。
如果kubelet正常运行一个容器都没创建出来基本是pause镜像也就是infra镜像拉不下来,可以修改kubelet的参数--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.1,因为staticPod目录在/etc/kubernetes/manifests/,可能使用的是国外镜像,可以编辑yml里的域名部分更换为国内的

另外kubeadm部署的所有节点好像都是同时是master同时是node,单节点的话部署完会无法创建出pod,因为它会对role为master的node打上污点,你要么去掉这个污点(可以使用命令kubectl taint nodes --all node-role.kubernetes.io/master-去掉)或者创建的pod声明下容忍这个污点

个人建议

搭建

搭建的话单台不好看出一些特性,多台可能个人电脑带不起来.我建议是去别人的云上的环境里学下k8s知识再后期自己搭建踩坑.
如果非要入门开始用kubeadm在国内搭建最好找个详细的博客,看到部分博客没写清给系统设置一些参数和依赖就直接部署的,很多人没有设置selinux和swap还有sysctl的参数也跟着做结果报错的,这里推荐一个kubeadm部署的详细教程 https://qingmu.io/2018/12/20/Deploy-a-highly-available-cluster-with-kubeadm/
另外是容器进程的前后台,因为可能部分人学和用docker的时候都是docker run主进程跑个bash或者sh,然后docker exec进去启动业务进程的,如果他这种歪门邪道用k8s会发现pod无限重启,因为没理解容器主进程维持存活的概念,可以看我之前博客docker的一些概念那篇来理解

云上环境的话有两个:
1.katacontainer的 https://www.katacoda.com/
2.谷歌官方的play with k8s https://labs.play-with-k8s.com/ (需要翻墙)
前者网站里的k8s部分很详细,后者可以加多个instance,两者实际环境都在国外,想法高也可以用来搞其他的事情
最后,你都看到这了,我肯定无法阻止你学k8s,但是有空还是要补习下其他方面的知识,毕竟k8s涵盖了对网络、存储、调度、操作系统、分布式原理等各个方面的内容.
同时建议看完官方文档的concepts和tasks这俩板块,书籍<<k8s权威指南第二版>>是官方这俩板块内容的翻译+一些理解,不建议看权威指南,因为书开头的例子和安装都很坑,除非你不是按照他上面搭建的集群,而且不建议跟着它上面的第一个例子做

CATALOG
  1. 1. 说说一些现象
  2. 2. 一些建议
  3. 3. 不得不说的kubeadm
    1. 3.1. 关于镜像
    2. 3.2. 关于kubeadm对于k8s组件这部分
  4. 4. 个人建议
    1. 4.1. 搭建