文章目录
- 安装Docker
- K8s的安装条件
- K8s和其他工具需要开放的端口
- 安装kubeadm, kubelet 和 kubectl
- 使用 kubeadm 创建一个单主集群
安装Docker
Docker的安装可以查看以前的文章 云服务器下Docker的安装和配置 Docker启动,并设置自启动。
[root@master ~]# systemctl start docker
[root@master ~]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
K8s的安装条件
这里我们利用kubeadm安装k8s集群,kubeadm支持多种系统,这里简单介绍一下需要的系统要求:
- Ubuntu16.04+ / Debian 9 / CentOS 7 / RHEL 7 / Fedora 25/26(best-effort) / HypriotOS v1.0.1+ / Other
- 2GB或者以上的RAM(否则将没有足够空间留给app)
- 2核以上CPU
- 集群的机器之间必须能通过网络互相通信
- SWAP必须被关闭,否则kubelet会出错
- 将 SELinux 设置为 permissive 模式(将其禁用)
检测SWAP是否被关闭,可以通过free -g
命令。
[root@master ~]# free -g
total used free shared buff/cache available
Mem: 3 0 2 0 1 3
Swap: 0 0 0
可以看到swap各项都是0。
关闭swap的命令swapoff -a
。
检测SELinux是否是禁用的,可以查看vi /etc/sysconfig/selinux
中的SELINUX=disabled
是否设置。
关闭SELinux
$ setenforce 0
$ sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
K8s和其他工具需要开放的端口
安装kubeadm, kubelet 和 kubectl
- 配置国内数据源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
- 安装kubeadm, kubelet 和 kubectl
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
- 启动kubelet服务
systemctl enable kubelet && systemctl start kubelet
kubelet 现在每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环。
查看版本
$ docker --version
Docker version 18.06.1-ce, build e68fc7a
$ kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"12", GitVersion:"v1.12.1", GitCommit:"4ed3216f3ec431b140b1d899130a69fc671678f4", GitTreeState:"clean", BuildDate:"2018-10-05T16:43:08Z", GoVersion:"go1.10.4", Compiler:"gc", Platform:"linux/amd64"}
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"12", GitVersion:"v1.12.1", GitCommit:"4ed3216f3ec431b140b1d899130a69fc671678f4", GitTreeState:"clean", BuildDate:"2018-10-05T16:46:06Z", GoVersion:"go1.10.4", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"12", GitVersion:"v1.12.1", GitCommit:"4ed3216f3ec431b140b1d899130a69fc671678f4", GitTreeState:"clean", BuildDate:"2018-10-05T16:36:14Z", GoVersion:"go1.10.4", Compiler:"gc", Platform:"linux/amd64"}
$ kubelet --version
Kubernetes v1.12.1
使用 kubeadm 创建一个单主集群
在运行 kubeadm init
之前请先执行 kubeadm config images pull
来测试与 gcr.io 的连接。
连接不成功可以使用--image-repository
手动配置阿里的镜像源。
[root@master ~]#kubeadm init \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version stable \
--pod-network-cidr=10.244.0.0/16
初始化命令说明:--apiserver-advertise-address
指明用 Master 的哪个 interface 与 Cluster 的其他节点通信。如果 Master 有多个 interface,建议明确指定,如果不指定,kubeadm 会自动选择有默认网关的 interface。
--pod-network-cidr
指定 Pod 网络的范围。Kubernetes 支持多种网络方案,而且不同网络方案对 --pod-network-cidr 有自己的要求,这里设置为 10.244.0.0/16 是因为我们将使用 flannel 网络方案,必须设置成这个 CIDR。
--image-repository
Kubenetes默认Registries地址是 k8s.gcr.io,在国内并不能访问 gcr.io,在1.13版本中我们可以增加–image-repository参数,默认值是 k8s.gcr.io,将其指定为阿里云镜像地址:registry.aliyuncs.com/google_containers。
出现这句话表示成功了:
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
........
如果需要再次运行 kubeadm init,必须先卸载集群kubeadm reset
。
这时执行下面的语句:
[root@master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
master NotReady master 55m v1.16.2
显示目前节点是not ready状态,先不要急,我们先来看一下kudeadm帮我们安装了哪些东西:
kudeadm的思路,是通过把k8主要的组件容器化,来简化安装过程。这时候你可能就有一个疑问,这时候k8集群还没起来,如何来部署pod?难道直接执行docker run?当然是没有那么low,其实在kubelet的运行规则中,有一种特殊的启动方法叫做“静态pod”(static pod),只要把pod定义的yaml文件放在指定目录下,当这个节点的kubelet启动时,就会自动启动yaml文件中定义的pod。从这个机制你也可以发现,为什么叫做static pod,因为这些pod是不能调度的,只能在这个节点上启动,并且pod的ip地址直接就是宿主机的地址。在k8中,放这些预先定义yaml文件的位置是/etc/kubernetes/manifests
,我们来看一下。
[root@master ~]# cd /etc/kubernetes/manifests
[root@master manifests]# ls
etcd.yaml kube-apiserver.yaml kube-controller-manager.yaml kube-scheduler.yaml
这四个就是k8的核心组件了,以静态pod的方式运行在当前节点上(也就是所谓的组件容器化)
- etcd:k8s的数据库,所有的集群配置信息、密钥、证书等等都是放在这个里面,所以生产上面一般都会做集群,挂了不是开玩笑的
- kube-apiserver: k8的restful api入口,所有其他的组件都是通过api-server来操作kubernetes的各类资源,可以说是k8最底层的组件
- kube-controller-manager: 负责管理容器pod的生命周期
- kube-scheduler: 负责pod在集群中的调度
现在我们来执行一下:
[root@master manifests]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-58cc8c89f4-fnc8c 0/1 Pending 0 60m
coredns-58cc8c89f4-qkc46 0/1 Pending 0 60m
etcd-master 1/1 Running 0 59m
kube-apiserver-master 1/1 Running 0 59m
kube-controller-manager-master 1/1 Running 0 59m
kube-proxy-h8cq8 1/1 Running 0 60m
kube-scheduler-master 1/1 Running 0 59m
可以看到kubeadm帮我们安装的,就是我上面提到的那些组件,并且都是以pod的形式安装。同时你也应该注意到了,coredns的两个pod都是pending状态,这是因为网络插件还没有安装。
所以必须先安装 Pod 网络插件,以便 Pod 可以互相通信。网络必须在部署任何应用之前部署好。此外,在网络安装之前是 CoreDNS 不会启用的。 kubeadm 只支持基于容器网络接口(CNI)的网络而且不支持 kubenet 。
[root@master manifests]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
安装完网络插件后,再查看一下状态:
[root@master ~]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-58cc8c89f4-5tdfp 1/1 Running 0 2m38s
coredns-58cc8c89f4-6tfdj 0/1 Running 0 2m38s
etcd-master 1/1 Running 0 102s
kube-apiserver-master 1/1 Running 0 112s
kube-controller-manager-master 1/1 Running 0 96s
kube-flannel-ds-amd64-ck5qj 1/1 Running 0 26s
kube-proxy-7rf87 1/1 Running 0 2m38s
kube-scheduler-master 1/1 Running 0 103s
不过当我们使用kubectl命令创建pod的时候,会出现如下提示:
[root@master ~]# kubectl create -f obj.json
The connection to the server localhost:8080 was refused - did you specify the right host or port?
原因:kubenetes master没有与本机绑定,集群初始化的时候没有设置。如果需要让普通用户可以运行 kubectl,请运行如下命令export KUBECONFIG=/etc/kubernetes/admin.conf
。
注意:如果想让master能够处理pod的话需要运行下面的命令:
[root@master ~]# kubectl taint nodes --all node-role.kubernetes.io/master-
node/master untainted
更多安装信息查看
- 使用 kubeadm 创建一个单主集群
- 使用kubernetes 官网工具kubeadm部署kubernetes(使用阿里云镜像)