Kubernetes是Google大神开源的容器管理组件,常被称为K8s (PS:K表示第一个字母,s表示最后一个字母,8表示中间一共有8个字母:) ). 被Docker的使用者用于Docker服务的编排和管理。虽然Docker家出了Swarm用来管理Docker,但是目前来看,使用K8s的仍然居多。
K8s的几个概念
- Pod
K8s部署调度的最小单元,运行在node节点上。运行在同一个Pod内的多个容器共享相同的网络命名空间、IP地址和端口。 - RC (Replication Controller)
RC用来保证Pod按照一定的备份数运行。 - Service
Service定义了Pod的逻辑集合和访问策略... - Node
Node是k8s集群中Pod运行的节点。
K8s集群部署方式
关于K8s的集群部署方式有很多,比如说tar包/rpm下载安装,手动配置。这种方法比较麻烦。自从K8s 1.5版本后,新增了kubeadm init方法,能够快速的安装k8s集群。虽然目前这个方法还是beta版本,并且被警告不要在生产环境中使用 (: ,但是经过笔者的测试,kubeadm init能够方便的部署k8s,期待早日转正 :)
以下是笔者在使用kubeadm init部署过程中整理的方法记录,大部分来源于官方文档: https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/
此外加了一些在过程中遇到的问题和解决方法,以供参考。
准备条件
- 安装Docker, 参照
https://docs.docker.com/engine/installation/linux/docker-ce/centos/#install-from-a-package - 打开net.bridge.bridge-nf-call-iptables
此处有坑1
如果不设置,在后面执行kubeadm init时,precheck会报错。
sysctl -w net.bridge.bridge-nf-call-iptables="1"
- 配置k8s yum源,如果能够连外网使用google的源,否则的话可以找找国内的代理源或者自行下载kubeadm和kubelet的安装包手动安装。
google的yum源如下:
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
安装kubeadm和kubelet
本次安装选择的是1.6.6版本。
yum install kubelet-1.6.6*
yum install kubeadm-1.6.6*
在安装过程中,会自动的将一些依赖安装,如果某些依赖的源没有在yum中配置,需要加上可以访问的源。
使用 kubeadm init
在k8s的安装文档中,本步骤最简单,只有一行命令,但是在实际操作过程中也是最容易出问题的一步。
登录master节点,执行 kubeadm init,开始初始化master。
此处有坑2
这时候一般会卡到 [apiclient] Created API client, waiting for the control plane to become ready
[kubeadm] WARNING: kubeadm is in beta, please do not use it for production clusters.
[init] Using Kubernetes version: v1.7.0
[init] Using Authorization modes: [Node RBAC]
[preflight] Running pre-flight checks
[preflight] Starting the kubelet service
[certificates] Generated CA certificate and key.
[certificates] Generated API server certificate and key.
[certificates] API Server serving cert is signed for DNS names [kubeadm-master kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 10.138.0.4]
[certificates] Generated API server kubelet client certificate and key.
[certificates] Generated service account token signing key and public key.
[certificates] Generated front-proxy CA certificate and key.
[certificates] Generated front-proxy client certificate and key.
[certificates] Valid certificates and keys now exist in "/etc/kubernetes/pki"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/admin.conf"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/kubelet.conf"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/controller-manager.conf"
[kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/scheduler.conf"
[apiclient] Created API client, waiting for the control plane to become ready
这个时候就比较抓瞎,没有更多有价值的log输出。这时候可以使用
journalctl -xeu kubelet
打印出log。
如果有如下错误log, 说明kubelet的driver设置的不对。
cgroup driver: "systemd" is different from docker cgroup driver: "cgroupfs"
设置 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf 里的
--cgroup-driver=cgroupfs
保存后,执行systemctl daemon-reload 让配置生效。
再执行kubeadm init,成功完成。
使master节点可以调度pod
默认情况下,master节点不能被调度启动pod,如果需要将master节点加入到调度中,需要执行以下命令:
kubectl taint nodes --all node-role.kubernetes.io/master-
配置pod网络插件
K8s支持以下多种网络插件。在master节点使用 kubectl apply -f 配置网络插件。
以Weave net插件为例,可以通过如下命令配置:
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
验证是否添加成功可以执行:
kubectl get pods --all-namespaces
如下图,可以看到,weave相关已经成功创建并拉起。
给集群加入节点
master初始化完成后,可以向此K8s集群增加node节点。一条简单的join命令即可完成。
登录到node节点,执行:
kubeadm join --token <token> <master-ip>:<master-port>
其中token可以在master节点执行 kubeadm token list 查看, 另外默认的master-port一般是6443.
此处有坑3
根据官方文档,执行完此语句后,在master节点上通过 kubeadm get nodes 就可以查看到已经将node节点加入集群。但是在实际操作中,发现在node节点上执行join语句成功,但是在master节点上看不到新增的node节点。
在node节点上查看kubelet, 发现kubelet没有启动。在node节点上执行 journalctl -xeu kubelet 看到和master节点之前一样的问题,cgroup driver不一致。经过相同的解决方法,成功将node节点拉起后,过几秒钟在master节点上查看,已经能够显示新增的节点了。
部署简单的K8s集群完成。