1. 环境准备
机器名 | 资源配置 | 操作系统 | 角色 | IP |
---|---|---|---|---|
k8s101 | 2/cpu+2G/mem | CentOS7.4-x86_64 | Master | 172.17.8.101 |
k8s102 | 2/cpu+2G/mem | CentOS7.4-x86_64 | Node | 172.17.8.102 |
k8s103 | 2/cpu+2G/mem | CentOS7.4-x86_64 | Node | 172.17.8.103 |
2. 应用版本准备
docker版本 | etcd版本 | CoreDNS版本 | kubernetes版本 | flannel版本 |
---|---|---|---|---|
docker-ce-18.03.1.ce-1.el7 | etcd-v3.1.12 | v1.1.3 | v1.10.5 | v0.10.0 |
3. 机器角色的分配
- k8s101
- kube-apiserver - kube-controller-manager - kube-scheduler - etcd
- k8s102
- kubelet - kube-proxy - docker - flannel - etcd
- k8s103
- kubelet - kube-proxy - docker - flannel - etcd
4. 所有机器安装集群依赖的软件包
1 | #清空防火墙规则 |
5.1 准备自签名证书(其中一台机器操作即可)
组件 | 使用到的证书 |
---|---|
etcd | ca.pem, kubernetes-key.pem, kubernetes.pem |
flannel | ca.pem, kubernetes-key.pem, kubernetes.pem |
kube-apiserver | ca.pem, kubernetes-key.pem, kubernetes.pem |
kubelet | ca.pem |
kube-proxy | ca.pem, kube-proxy.pem, kube-proxy-key.pem |
kubectl | ca.pem, admin.pem, admin-key.pem |
kube-controller | 当前需要和 kube-apiserver 部署在同一台机器上且使用非安全端口通信,故不需要证书 |
kube-schedule | 当前需要和 kube-apiserver 部署在同一台机器上且使用非安全端口通信,故不需要证书 |
1 | #安装证书生成个工具 |
5.2 修改刚生成的json文件
1 | 根据config.json创建ca-config.json: |
5.3 生成相应的证书和key
1 | #生成ca的证书和key |
5.4 查看一下是否生成了相应的证书和key
1 | #仅保留相应的pem证书 |
6.1 安装etcd组件(所有机器)
1 | #下载etcd |
6.2 分别配置每个机器的参数(k8s101为例)
1 | cat > /opt/kubernetes/cfg/etcd << EOF |
6.3 配置etcd的服务
1 | #把下面这个粘贴到/usr/lib/systemd/system/etcd.service |
7. 下载flannel并安装应用到所有Node节点,假设k8s102
1 | #下载flannel-v0.10 |
8.1 生成k8s TLS Boostrapping Token(在任意一个master上操作)
1 | mkdir kubeconfig && cd kubeconfig |
8.2 创建kubelet bootstrapping kubeconfig文件
1 | #安装kubectl客户端工具 |
8.3 创建kube-proxy bootstrapping kubeconfig文件
1 | kubectl config set-cluster kubernetes \ |
9.把刚才创建的kubeconfig文件拷贝到所有的node节点上,位置先随意
1 | scp kube-proxy.kubeconfig node1_ip:~/ |
10. 安装master节点
1 | rm -rf kubernetes |
11. 安装配置node
- 建议kubelet参数修改加上KUBELET_EXTRA_ARGS= “–fail-swap-on=false” 忽略swap的配置
- kubelet v1.11.1 建议配置 KUBE_PROXY_MODE=ipvs
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112#在master上执行,创建角色绑定
kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
#下面都是在node节点上操作
#把刚才传过来的kubeconfig文件都放在指定位置
cd kubeconfig/
cp *kubeconfig /opt/kubernetes/cfg/
#下载client包
wget -c https://dl.k8s.io/v1.10.5/kubernetes-node-linux-amd64.tar.gz
tar xf kubernetes-node-linux-amd64.tar.gz
cd kubernetes/node/bin/
mv kubelet kube-proxy /opt/kubernetes/bin/
#把下面的内容保存为kubelet.sh
NODE_ADDRESS=${1:-"192.168.1.196"}
DNS_SERVER_IP=${2:-"10.10.10.2"}
cat <<EOF >/opt/kubernetes/cfg/kubelet
KUBELET_OPTS="--logtostderr=true \\
--v=4 \\
--address=${NODE_ADDRESS} \\
--hostname-override=${NODE_ADDRESS} \\
--kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig \\
--experimental-bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig \\
--cert-dir=/opt/kubernetes/ssl \\
--allow-privileged=true \\
--cluster-dns=${DNS_SERVER_IP} \\
--cluster-domain=cluster.local \\
--fail-swap-on=false \\
--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0"
EOF
cat <<EOF >/usr/lib/systemd/system/kubelet.service
[Unit]
Description=Kubernetes Kubelet
After=docker.service
Requires=docker.service
[Service]
EnvironmentFile=-/opt/kubernetes/cfg/kubelet
ExecStart=/opt/kubernetes/bin/kubelet \$KUBELET_OPTS
Restart=on-failure
KillMode=process
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable kubelet
systemctl restart kubelet
#执行脚本
bash kubelet.sh 172.17.8.102 10.254.0.2
#把下面的内容保存到proxy.sh
NODE_ADDRESS=${1:-"192.168.1.200"}
cat <<EOF >/opt/kubernetes/cfg/kube-proxy
KUBE_PROXY_OPTS="--logtostderr=true \
--v=4 \
--hostname-override=${NODE_ADDRESS} \
--kubeconfig=/opt/kubernetes/cfg/kube-proxy.kubeconfig"
EOF
cat <<EOF >/usr/lib/systemd/system/kube-proxy.service
[Unit]
Description=Kubernetes Proxy
After=network.target
[Service]
EnvironmentFile=-/opt/kubernetes/cfg/kube-proxy
ExecStart=/opt/kubernetes/bin/kube-proxy \$KUBE_PROXY_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable kube-proxy
systemctl restart kube-proxy
#执行proxy.sh
bash proxy.sh 172.17.8.102
#然后在master节点上操作,看到是Pending状态
kubectl get csr
NAME AGE REQUESTOR CONDITION
node-csr-6oXgQziElgXRb1eF0Q986YHP8tmmVcJVka1PD8Ox0l4 2m kubelet-bootstrap Pending
#这时候在master上授权允许就可以了
kubectl certificate approve node-csr-6oXgQziElgXRb1eF0Q986YHP8tmmVcJVka1PD8Ox0l4
#再次查看状态就变过来了
kubectl get csr
NAME AGE REQUESTOR CONDITION
node-csr-6oXgQziElgXRb1eF0Q986YHP8tmmVcJVka1PD8Ox0l4 4m kubelet-bootstrap Approved,Issued
#查看节点
kubectl get nodes
NAME STATUS ROLES AGE VERSION
172.17.8.102 Ready <none> 1m v1.10.5
#其他的客户端跟这个一样操作即可,等node节点状态变为Ready就可用了
#测试一个实例
kubectl run nginx --image=nginx --replicas=3
kubectl scale --replicas=4 deployment/nginx
kubectl expose deployment nginx --port=88 --target-port=80 --type=NodePort
12. 配置一个客户端kubectl
1 | #把admin.pem和admin-key.pem,ca.pem拷贝到你想配置的节点上 |
13.1 配置Dashboard相关yaml文件
1 | #把下面内容保存为dashboard-rbac.yaml |
13.2 安装dashboard
1 | kubectl create -f dashboard-rbac.yaml |
14.1 把下面内容保存为coredns.yaml
1 | apiVersion: v1 |
14.2 安装过程
1 | kubectl create -f coredns.yaml |