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.
这里我们利用kubeadm安装k8s集群,kubeadm支持多种系统,这里简单介绍一下需要的系统要求:
检测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到底是什么
cat < /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
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
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 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的方式运行在当前节点上(也就是所谓的组件容器化)
现在我们来执行一下:
[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
更多安装信息查看