盒子
盒子
文章目录
  1. 安装前
  2. 安装基础组件
  3. 初始化集群

kubeadm安装kubernetes

目前Google官方提供了kubeadm来快速的初始化一个kubernetes集群,但是截止目前kubernetes 1.7为止仍然是一个beta版本。因此在初始化集群的时候会有相关的警告日志提示不要在生产环境这么操作。

安装前

在安装最好检查一下kubernetes所使用的端口没有被占用,以下列出可能使用到的的端口。

Master Node

Port Range Purpose
6443* Kubernetes API server
2379-2380 etcd server client API
10250 Kubelet API
10251 kube-scheduler
10252 kube-controller-manager
10255 Read-only Kubelet API (Heapster)

Worker Node

Port Range Purpose
10250 Kubelet API
10255 Read-only Kubelet API (Heapster)
30000-32767 Default port range for NodePort Services. Typically, these ports would need to be exposed to external load-balancers, or other external consumers of the application itself.

除此之外在安装的Pod网络插件,也可能需要某些端口不被占用,具体要参看所使用的插件。

安装基础组件

Docker
在每一个节点安装docker,官方推荐的版本是1.121.111.10也可以使用。因为我说使用的机器本身已经安装了最新版本的docker,即docker改变版本号规则后的版本17.0-ce,在默认kubeadm不加任何参数初始化集群的时候导致无法识别版本号而报错。

对于centos系统添加该版本的源:

1
2
3
4
5
6
7
8
cat <<EOF > /etc/yum.repos.d/docker.repo
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF

接着查看可见的docker包:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# yum list docker-engine.x86_64 --showduplicates | sort -r
* updates: mirrors.163.com
Loading mirror speeds from cached hostfile
Loaded plugins: fastestmirror, langpacks
* extras: repo.virtualhosting.hk
docker-engine.x86_64 1.9.1-1.el7.centos dockerrepo
docker-engine.x86_64 1.9.0-1.el7.centos dockerrepo
docker-engine.x86_64 1.8.3-1.el7.centos dockerrepo
docker-engine.x86_64 1.8.2-1.el7.centos dockerrepo
docker-engine.x86_64 1.8.1-1.el7.centos dockerrepo
docker-engine.x86_64 1.8.0-1.el7.centos dockerrepo
docker-engine.x86_64 1.7.1-1.el7.centos dockerrepo
docker-engine.x86_64 17.05.0.ce-1.el7.centos dockerrepo
docker-engine.x86_64 17.04.0.ce-1.el7.centos dockerrepo
docker-engine.x86_64 17.03.1.ce-1.el7.centos dockerrepo
docker-engine.x86_64 17.03.0.ce-1.el7.centos dockerrepo
docker-engine.x86_64 1.7.0-1.el7.centos dockerrepo
docker-engine.x86_64 1.13.1-1.el7.centos dockerrepo
docker-engine.x86_64 1.13.0-1.el7.centos dockerrepo
docker-engine.x86_64 1.12.6-1.el7.centos dockerrepo
......
* base: mirrors.163.com
Available Packages

这里需要安装1.12版本的docker,就可以通过包管理器安装并启动服务:

1
yum install docker-engine-1.12.6-1.el7.centos
1
2
systemctl start docker
systemctl enable docker

kubelet和kubeadm

kubelet是node上的核心组件,主要负责启动pod和容器等事情。kubeadm命令就用于初始化集群。添加这两个组件的安装源:

1
2
3
4
5
6
7
8
9
10
11
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[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
EOF
setenforce 0

然后安装并启用服务:

1
2
yum install -y kubelet kubeadm
systemctl enable kubelet && systemctl start kubelet

初始化集群

Master

master节点是控制面板运行的节点,包括etcd、以及与kubectl通信的API服务。初始化master节点直接在一台机器运行:

1
kubeadm init

这样就开始master节点的初始化配置工作,默认的就会自动检测网络接口为master的默认网关接口。可以通过参数--apiserver-advertise-address=<ip-address>来指定自己想要的。当然kubeadm init首先会做一系列的检查操作,来检查是否适合安装kubernetes,包括检查docker版本等。通过检查则会下载并安装集群的数据库和控制面板组件。初始化完成之后,输出的内容中最后会有下面的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Your Kubernetes master has initialized successfully!
To start using your cluster, you need to run (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:
http://kubernetes.io/docs/admin/addons/
You can now join any number of machines by running the following on each node
as root:
kubeadm join --token <token> <master-ip>:<master-port>

然后安装Pod的网络附件,在部署应用之前必须先安装网络附件。kubeadm仅仅支持Container Network Interface (CNI)网络,不支持kubenet。这里选择weave:

1
kubectl apply -n kube-system -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

另外需要选择的网络附件必须匹配安装的kubernetes版本,否则可能出现奇怪的错误。使用kubectl get pods --all-namespaces查看运行的Pod,只要有kube-dns的Pod状态为运行则表示网络附件安装成功。

默认集群是不会调度pods在master节点的,因此如果只有一台机器想要pods可以调度在master,则执行:

1
kubectl taint nodes --all node-role.kubernetes.io/master-

这样master节点已经初始化完成,并且可以创建一个Pod。

Node

如果有多个机器,master已经初始化完成,接着就需要其他node节点加入到master。首选需要一个token,在kubeadm init初始化一个集群时已经生成了一个token。使用kubeadm token list可以查看当前已经存在的token,包括过期时间及用途。也可使用kubeadm token createkubeadm token generate创建一个本地的token。kubeadm token generatekubeadm token create的区别在于前者生成的token可以在kubeadm init时通过--token参数指定。

根据上面获得的token分别在node机器上执行:

1
kubeadm join --token <token> <master-ip>:<master-port>

输出的结果如包含下面内容表示已经加入成功:

1
2
3
4
5
6
Node join complete:
* Certificate signing request sent to master and response
received.
* Kubelet informed of new secure connection details.
Run 'kubectl get nodes' on the master to see this machine join.

之后在master上运行kubectl get nodes可以获得node列表。

为了在工作机器上通过kubectl访问到集群,可以复制master上的kubeconfig文件到工作机器:

1
2
scp root@<master ip>:/etc/kubernetes/admin.conf .
kubectl --kubeconfig ./admin.conf get nodes

如果想要在集群外部访问API服务,则可以配置API服务的代理:

1
2
scp root@<master ip>:/etc/kubernetes/admin.conf .
kubectl --kubeconfig ./admin.conf proxy

这样就可以通过http://localhost:8001/api/v1访问API。查看/etc/kubernetes/admin.conf文件可以看到集群的一些配置,包括访问地址端口号及用户信息。

支持一下
扫一扫,支持forsigner