使用 Kubeadm
在 CentOs 上安装 Kubernetes
集群
环境准备
- 环境: CentOs7.3
- 运行机器IP
- 192.168.2.225(Master)
- 192.168.2.224(Node)
- 192.168.2.223(Node)
使用 DockerMachine
安装 Docker
- 安装
DockerMachine
1
wget -qO- https://blog.yumc.pw/attachment/script/shell/docker/machine.sh | bash
- SSH配置密钥 保证三台机器可以SSH互通(不会请自行百度)
- 防火墙开启端口(每台机器都需要开启 或者直接关闭防火墙)
1
2
3
4
5
6
7
8firewall-cmd --zone=public --add-port=2376/tcp --permanent
firewall-cmd --zone=public --add-port=2377/tcp --permanent
firewall-cmd --zone=public --add-port=7946/tcp --permanent
firewall-cmd --zone=public --add-port=7946/udp --permanent
firewall-cmd --zone=public --add-port=4789/udp --permanent
firewall-cmd --zone=public --add-port=6443/tcp --permanent
firewall-cmd --zone=public --add-port=10250/tcp --permanent
firewall-cmd --reload - 关闭Swap(所有节点都需要关闭)
1
swapoff -a
- 同时需要修改
/etc/fstab
注释 Swap 相关的条目1
sed -i '/swap/s/^/#/' /etc/fstab
- 开启IP转发 不然会导致容器无法访问网络
1
2
3
4echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
echo net.bridge.bridge-nf-call-iptables=1 >> /etc/sysctl.conf
echo net.bridge.bridge-nf-call-ip6tables=1 >> /etc/sysctl.conf
sysctl -p - 创建
Machine
1
2
3docker-machine create --driver generic --generic-ip-address=192.168.2.225 2-225
docker-machine create --driver generic --generic-ip-address=192.168.2.224 2-224
docker-machine create --driver generic --generic-ip-address=192.168.2.223 2-223
安装 Kubeadm
- 使用SSh链接到2-225
1
docker-machine ssh 225
- 添加
Kubernetes
源1
2
3
4
5
6
7
8
9
10cat > /etc/yum.repos.d/kubernetes.repo<<EOF
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF - 安装
Kubeadm
1
yum install -y -q kubeadm
手动拉取镜像
- 从阿里云镜像拉取
1
curl -qs https://raw.githubusercontent.com/502647092/k8s/master/pull_from_aliyun.sh | bash
使用 Kubeadm
搭建 Kubernetes
集群
旧版本初始化配置(v1.11.3之前的版本)
1
2
3
4
5
6
7
8
9
10
11
12
13
14apiVersion: kubeadm.k8s.io/v1alpha2
kind: MasterConfiguration
kubernetesVersion: v1.11.3
#用于配置API服务地址 多个IP的时候需要用到
controlPlaneEndpoint: '192.168.2.101'
#用于新增API服务器域名
#apiServerCertSANs:
#- '192.168.2.101'
apiServerExtraArgs:
runtime-config: api/all=true
controllerManagerExtraArgs:
horizontal-pod-autoscaler-sync-period: 10s
horizontal-pod-autoscaler-use-rest-clients: "true"
node-monitor-grace-period: 10s创建初始化配置(当前发布时的最新版本)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17cat > kubeadm.yml<<EOF
apiVersion: kubeadm.k8s.io/v1alpha3
kind: ClusterConfiguration
imageRepository: k8s.gcr.io
kubernetesVersion: v1.12.1
#用于配置API服务地址 多个IP的时候需要用到
controlPlaneEndpoint: '192.168.2.101'
#用于新增API服务器域名
#apiServerCertSANs:
#- '192.168.2.101'
apiServerExtraArgs:
runtime-config: api/all=true
controllerManagerExtraArgs:
horizontal-pod-autoscaler-sync-period: 10s
horizontal-pod-autoscaler-use-rest-clients: "true"
node-monitor-grace-period: 10s
EOF初始化 Master 节点
1 | kubeadm init --config kubeadm.yml |
1 | [root@2-225 ~]$ kubeadm init --config kubeadm.yml |
- 在子节点上执行刚才
init
之后最后出现的命令
1 | [root@2-223 ~]$ kubeadm join 192.168.2.225:6443 --token 8qebd3.g81fncibeelo542a --discovery-token-ca-cert-hash sha256:d15f7dc588ec3b14b076837657c8dc3af0759eb65beac919984cb134a912ab09 |
- 如果遇到下列错误 证书错误问题 请同步两台服务器的时间
1 | [root@k8s-node1 ~]$ kubeadm join 192.168.10.44:6443 --token 4ihi3s.jx91ma431zq8cjmj --discovery-token-ca-cert-hash sha256:63c0fd0455e216bd4128a91ecf1400db4b17fb846ccc39814d43aa5e3be015f3 |
- 如果遇到下列错误 那就是版本不匹配 请保证两个服务器的版本相同
1 | [root@k8s-node1 ~]$ kubeadm join 192.168.10.44:6443 --token 30z69g.k420edr94ms96hmv --discovery-token-ca-cert-hash sha256:ee5dbd2a205a775f8cb26f10ead191cb91648dabec0d742b68a1473757146995 |
- 主节点配置
kubectl
1 | mkdir -p $HOME/.kube |
- 查看节点状态
1 | kubectl get nodes,po,svc --all-namespaces |
1 | [root@2-225 k8s]$ kubectl get nodes,po,svc --all-namespaces |
- 这里显示节点都是
NotReady
原因可以用kubectl describe node <节点状态>
看到
1 | [root@2-225 ~]$ kubectl describe node 2-225 |
- 查看
coredns
容器状态 可以在Event
看到因为网络插件未就绪 所以容器没有启动成功
1 | kubectl describe po $(kubectl get po -n=kube-system | grep coredns | tail -n 1 | awk '{print $1}') -n=kube-system |
1 | [root@2-225 ~]$ kubectl describe po $(kubectl get po -n=kube-system | grep coredns | tail -n 1 | awk '{print $1}') -n=kube-system |
配置开机自启动
所有节点
设置kubelet
开机自启动1
systemctl enable kubelet.service
安装扩展插件
安装 CNI
网络插件
- 安装
Weave
网络插件
1 | kubectl apply -f https://git.io/weave-kube-1.6 |
1 | [root@2-225 ~]$ kubectl apply -f https://git.io/weave-kube-1.6 |
安装 Rook
存储插件
- 安装存储插件
1 | kubectl apply -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/ceph/common.yaml |
1 | [root@2-225 k8s]$ kubectl apply -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/ceph/common.yaml |
- 查看存储插件情况
1 | [root@2-225 k8s]$ kubectl describe pods -n rook-ceph-system |
- 创建
PV
1 | cat > rook-storage.yaml<<EOF |
安装 Dashboard
控制面板
如果点登陆没反应 记得注意官方文档这句话 也就是登录到 Dashboard 必须满足 HTTPS访问 或者 HTTP+localhost 访问 不然点击登陆按钮不会有任何反应 详见 ISSUES
NOTE: Dashboard should not be exposed publicly using kubectl proxy command as it only allows HTTP connection. For domains other than localhost and 127.0.0.1 it will not be possible to sign in. Nothing will happen after clicking Sign in button on login page.
安装面板的命令
1 | kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml |
创建访问 Dashboard
的账户
这里推荐使用第二种方式
用Dashboard自带的角色添加权限
给
kubernetes-dashboard
的ServiceAccount
绑定权限1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17cat > dashboard-admin.yaml<<EOF
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: kubernetes-dashboard
labels:
k8s-app: kubernetes-dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: kubernetes-dashboard
namespace: kube-system
EOF
kubectl apply -f dashboard-admin.yaml此账户获取Token的方式
1
kubectl describe secrets $(kubectl get secrets --namespace kube-system | grep dashboard-token | awk '{print $1}') --namespace kube-system | grep token: | awk '{print $2}'
新建一个管理员
安全一点的方式是新建一个账户 赋予权限
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26cat > admin-role.yaml<<EOF
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: admin
annotations:
rbac.authorization.kubernetes.io/autoupdate: "true"
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
name: admin
namespace: kube-system
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin
namespace: kube-system
labels:
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
EOF
kubectl apply -f admin-role.yaml此账户获取Token的方式
1
kubectl describe secrets $(kubectl get secrets --namespace kube-system | grep admin-token | awk '{print $1}') --namespace kube-system | grep token: | awk '{print $2}'
访问面板
通过 Proxy 方式访问
- 第一种通过
kubectl proxy
暴露API (这种方法只能本地访问)- 开启代理
1
kubectl proxy &
- 然后访问
http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/login
- 开启代理
通过新建服务 对外暴露端口
- 通过
NodeIP+NodePort
访问 此方法可以任意访问 但是存在证书问题 忽略即可- 修改
kubernetes-dashboard.yaml
文件1
2wget -Okubernetes-dashboard.yaml https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
vi kubernetes-dashboard.yaml - 拉到底 找到
Service
区域spec
改为NodePort
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
type: NodePort
ports:
- port: 8443
targetPort: 8443
nodePort: 30443
selector:
k8s-app: kubernetes-dashboard - 重新部署 使其生效
1
kubectl apply -f kubernetes-dashboard.yaml
- 访问
https://NodeIP:30443
如果提示NET::ERR_CERT_INVALID
点击继续访问
- 修改
使用 Token 登录面板
- 打开
Dashboard
之后 点击Token
登录 输入上面获取到的Token
登录即可
错误处理
API服务器连接错误导致的无法启动
- 启动失败 由于无法链接API服务器
1 | kubectl logs $(kubectl get po -n=kube-system | grep dashboard | tail -n 1 | awk '{print $1}') -n=kube-system |
1 | [root@local k8s]$ kubectl logs $(kubectl get po -n=kube-system | grep dashboard | tail -n 1 | awk '{print $1}') -n=kube-system |
- 处理方案
- 正常情况下
kube-system
的状态结果1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27[root@localhost k8s]$ kubectl get nodes,po,svc -n=kube-system
NAME STATUS ROLES AGE VERSION
node/2-111 Ready master 9m51s v1.12.1
node/2-112 Ready <none> 9m33s v1.12.1
node/2-113 Ready <none> 9m31s v1.12.1
node/2-114 Ready <none> 9m29s v1.12.1
NAME READY STATUS RESTARTS AGE
pod/coredns-576cbf47c7-4mng5 1/1 Running 0 9m41s
pod/coredns-576cbf47c7-nm46w 1/1 Running 0 9m41s
pod/etcd-2-111 1/1 Running 0 8m53s
pod/kube-apiserver-2-111 1/1 Running 0 8m41s
pod/kube-controller-manager-2-111 1/1 Running 0 8m57s
pod/kube-proxy-29c28 1/1 Running 0 9m33s
pod/kube-proxy-555dm 1/1 Running 0 9m29s
pod/kube-proxy-nl4c7 1/1 Running 0 9m31s
pod/kube-proxy-qpq99 1/1 Running 0 9m41s
pod/kube-scheduler-2-111 1/1 Running 0 8m32s
pod/kubernetes-dashboard-77fd78f978-bh6x7 1/1 Running 0 4m18s
pod/weave-net-7h6p2 2/2 Running 0 7m20s
pod/weave-net-jg8nk 2/2 Running 0 7m20s
pod/weave-net-jj88s 2/2 Running 0 7m20s
pod/weave-net-kff86 2/2 Running 0 7m20s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP 9m47s
service/kubernetes-dashboard NodePort 10.105.50.231 <none> 443:30443/TCP 4m18s - 第一步 检查
coredns
是否启动完成 如果没有 重新配置 - 第二步 检查
weave
CNI 网络插件是否启动完成 如果没有 重新配置 - 如果上述方案都不行 那就自行
Google
吧
- 正常情况下
安装 Heapster
监控
1 | kubectl apply -f https://raw.githubusercontent.com/kubernetes/heapster/master/deploy/kube-config/standalone/heapster-controller.yaml |
完全删除安装(会删除所有包括Docker)
1 | kubeadm reset -f |
相关问题处理
机器重启后 Kubernetes
集群没有自动启动
- 查看错误 发现是 swap 没有关闭导致的
1 | [root@2-225 ~]$ kubelet |
- 修改
/etc/fstab
注释类型为swap
的条目
1 | # |