# 使用 kubeadm 安装部署 kubernetes 1.9

kubeadm是官方提供的安装方案,比纯手工安装方便。

# 零 准备

在安装前需做些设置让系统环境一致,确保后面顺利安装。

# 0.0 硬件情况

系统:centos 7

用户: root

机器规划: | 角色|数量|配置|物理ip|hostname| |------| ------ |------ |------ | | master|1| 4核 16G|172.16.93.220 |k8s | | node|1| 4核 16G|172.16.89.34 |cs-k8s-34 | | node|1| 4核 16G|172.16.89.35 |cs-k8s-35 |

硬件配置参考:CPU 2核或以上,内存2GB或以上。

机器最好都在同一个局域网,在三台机器上都设置好hostname

# 0.1 配置代理

参考:centos7下终端使用代理

配置yum使用代理

echo "proxy=http://127.0.0.1:8118" >> /etc/yum.conf

这里注意下,终端不需要使用代理,配置完Privoxy即可。

# 0.2 系统设置

0.2.1 关闭防火墙吧,省事点,如果处于安全考虑,注意后面要开放端口。

systemctl stop firewalld
systemctl disable firewalld

0.2.2 关闭swap内存

swapoff -a

修改/etc/fstab文件,注释掉SWAP的自动挂载,使用free -m确认swap已经关闭。

0.2.3 关闭selinux

vim /etc/sysconfig/selinux
将SELINUX修改为disabled

运行

setenforce 0

# 0.3 调整内核参数

cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system

# 一 安装

# 1.0 版本选择

三台机器都需安装docker, kubeadm, kubelet和kubectl

版本如下:

docker-1.12.6-68
kubelet-1.9.0-0.x86_64
kubectl-1.9.0-0.x86_64
kubeadm-1.9.0-0.x86_64

# 1.1 安装docker

yum install -y docker
systemctl enable docker 
systemctl start docker

配置docker代理

mkdir -p /etc/systemd/system/docker.service.d

添加如下内容到/etc/systemd/system/docker.service.d/http-proxy.conf

[Service]
Environment="HTTP_PROXY=http://127.0.0.1:8118" "NO_PROXY=localhost,172.16.0.0/16,127.0.0.1,10.244.0.0/16"

添加如下内容到/etc/systemd/system/docker.service.d/https-proxy.conf

[Service]
Environment="HTTPS_PROXY=https://127.0.0.1:8118" "NO_PROXY=localhost,172.16.0.0/16,127.0.0.1,10.244.0.0/16"

启动docker

systemctl daemon-reload && systemctl restart docker

# 1.2 安装kubeadm, kubelet和kubectl

配置kubernetes源

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

开始安装

yum install -y kubelet kubeadm kubectl
systemctl enable kubelet && sudo systemctl start kubelet

至此,在所有机器上安装所需的软件已经结束。

# 二 在master上配置

# 2.0 初始化K8S

通过kubeadm init命令来初始化,指定一下kubernetes版本,并设置一下pod-network-cidr。

kubeadm init --kubernetes-version=v1.9.0 --pod-network-cidr=10.244.0.0/16

等待执行完成后,会看到类似如下的提示,非常友好

kubeadm join --token 2fae1b.e4306e679794caaf 172.16.93.220:6443 --discovery-token-ca-cert-hash sha256:26d12811d5a60ecd91ba6bfea03daa34460d6143ceb11777179fd02e09f0ad16

这行内容先记录下,等下节点添加的时候要使用。

# 2.1 添加K8S配置

export KUBECONFIG=/etc/kubernetes/admin.conf
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile

# 2.2 安装network addon

要docker之间能互相通信需要做些配置,这里用Flannel来实现

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml

安装完成后,通过kubectl get pods --all-namespaces来判断kube-dns是否安装成功。

[root@k8s ~]# kubectl get pods --all-namespaces
NAMESPACE     NAME                                    READY     STATUS    RESTARTS   AGE
default       redis-test-9b545dd64-8v5mv              1/1       Running   0          1d
kube-system   etcd-k8s                                1/1       Running   1          2d
kube-system   heapster-5c448886d-z9j4n                1/1       Running   0          1d
kube-system   kube-apiserver-k8s                      1/1       Running   1          2d
kube-system   kube-controller-manager-k8s             1/1       Running   1          2d
kube-system   kube-dns-6f4fd4bdf-pp8bg                3/3       Running   3          2d
kube-system   kube-flannel-ds-2xmhn                   1/1       Running   3          2d
kube-system   kube-flannel-ds-rdnwn                   1/1       Running   2          2d
kube-system   kube-flannel-ds-sqltw                   1/1       Running   1          2d
kube-system   kube-proxy-4zbrs                        1/1       Running   2          2d
kube-system   kube-proxy-d4mpm                        1/1       Running   1          2d
kube-system   kube-proxy-drcf7                        1/1       Running   2          2d
kube-system   kube-scheduler-k8s                      1/1       Running   1          2d

可以看到kube-dns-6f4fd4bdf-pp8bg为running状态。

至此,master部分的配置就完成了。

# 三 node加入集群

登录172.16.89.34和172.16.89.35,执行刚才记录的那一行命令

kubeadm join --token 2fae1b.e4306e679794caaf 172.16.93.220:6443 --discovery-token-ca-cert-hash sha256:26d12811d5a60ecd91ba6bfea03daa34460d6143ceb11777179fd02e09f0ad16

顺利的话可以看到类似如下的提示

Run 'kubectl get nodes' on the master to see this node join the cluster.

回到master机器上,运行该命令查看结果

[root@k8s ~]# kubectl get nodes
NAME        STATUS    ROLES     AGE       VERSION
cs-k8s-34   Ready     <none>    2d        v1.9.0
cs-k8s-35   Ready     <none>    2d        v1.9.0
k8s         Ready     master    2d        v1.9.0

可以看到两个节点都已经加入了,并且是正常的ready状态。

至此,整个集群的配置完成,可以开始使用了。

# 四 配置dashboard

默认是没web界面的,可以在master机器上安装一个dashboard插件,实现通过web来管理

# 4.0 下载配置文件

wget https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml

编辑kubernetes-dashboard.yaml文件,在Dashboard Service中添加type: NodePort,暴露Dashboard服务

# ------------------- Dashboard Service ------------------- #
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  type: NodePort
  ports:
    - port: 443
      targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard

# 4.1 安装Dashboard插件

kubectl create -f kubernetes-dashboard.yaml

# 4.2 授予Dashboard账户集群管理权限

需要一个管理集群admin的权限,新建kubernetes-dashboard-admin.rbac.yaml文件,内容如下

apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard-admin
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: kubernetes-dashboard-admin
  labels:
    k8s-app: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: kubernetes-dashboard-admin
  namespace: kube-system

执行命令

kubectl create -f kubernetes-dashboard-admin.rbac.yaml

找到kubernete-dashboard-admin的token,用户登录使用

执行命令

[root@k8s ~]# kubectl -n kube-system get secret | grep kubernetes-dashboard-admin
kubernetes-dashboard-admin-token-ddskx           kubernetes.io/service-account-token   3         1d

可以看到名称是kubernetes-dashboard-admin-token-ddskx,使用该名称执行如下命令

[root@k8s ~]# kubectl describe -n kube-system secret/kubernetes-dashboard-admin-token-ddskx
Name:         kubernetes-dashboard-admin-token-ddskx
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name=kubernetes-dashboard-admin
              kubernetes.io/service-account.uid=3e70cc52-f121-11e7-a359-52540059e4c5

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1025 bytes
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC1hZG1pbi10b2tlbi1kZHNreCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC1hZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjNlNzBjYzUyLWYxMjEtMTFlNy1hMzU5LTUyNTQwMDU5ZTRjNSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTprdWJlcm5ldGVzLWRhc2hib2FyZC1hZG1pbiJ9.vz7xBUDYoIfeR83BfbUKAWFiKUAgTen7GP9b7d2nmcNIwAht6Xl6OaC-vjC66gaBD9Y-1ljb384jUoHQ0wCxE4tNFE8G5FR7-xbt-OpFt5razy28QIZYzeK_cP5af5RcdacYwWIRGHdPAp8Ki2dGNTqXMNL-0ySosCvNisTNgzvn0XbggLmXGYLfluNm75aitJFuzR3tOtKd-2qL27jccOtDE_MtE4zRQ-X5ikHT2vQGOEfLGaukbFN211AFVPe6Vgp18TJM3kTc0Yom5947ZB1E660IP4mCatMwHDadutb662rNJGSn65shrBua9u7yBK9xWQ_asAjHfZGKhdO2wg

记下这串token,等下登录使用,这个token默认是永久的。

# 4.3 找出Dashboard服务端口

[root@k8s ~]# kubectl get svc -n kube-system
NAME                   TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
heapster               ClusterIP   10.103.146.118   <none>        80/TCP          1d
kube-dns               ClusterIP   10.96.0.10       <none>        53/UDP,53/TCP   2d
kubernetes-dashboard   NodePort    10.103.190.189   <none>        443:31472/TCP   1d
monitoring-grafana     ClusterIP   10.109.25.3      <none>        80/TCP          1d
monitoring-influxdb    ClusterIP   10.109.165.19    <none>        8086/TCP        1d

可以看到它对外的端口为31472。 打开浏览器,访问https://172.16.93.220:31472/#!/login,选择令牌,输入刚才的token即可进入

界面如下

上图的图表需要安装heapster仪表盘插件才能看到

# 五 部署heapster插件

mkdir -p ~/k8s/heapster
cd ~/k8s/heapster
wget https://raw.githubusercontent.com/kubernetes/heapster/master/deploy/kube-config/influxdb/grafana.yaml
wget https://raw.githubusercontent.com/kubernetes/heapster/master/deploy/kube-config/rbac/heapster-rbac.yaml
wget https://raw.githubusercontent.com/kubernetes/heapster/master/deploy/kube-config/influxdb/heapster.yaml
wget https://raw.githubusercontent.com/kubernetes/heapster/master/deploy/kube-config/influxdb/influxdb.yaml
kubectl create -f ./

安装完成后,重新登录即可看到。

# 六 后记

在安装的时候参考了这两篇文章,节省了很多时间,感谢。

使用kubeadm在CentOS 7上安装Kubernetes 1.8

使用 kubeadm 创建 kubernetes 1.9 集群