安装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

一文彻底明白linux中的selinux到底是什么

K8s和其他工具需要开放的端口

在这里插入图片描述

安装kubeadm, kubelet 和 kubectl

  1. 配置国内数据源
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
  1. 安装kubeadm, kubelet 和 kubectl
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
  1. 启动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

更多安装信息查看

Logo

开源、云原生的融合云平台

更多推荐