1 实验环境说明
实验环境
lab1: etcd master haproxy keepalived 10.7.12.201
lab2: etcd master haproxy keepalived 10.7.12.202
lab3: etcd master haproxy keepalived 10.7.12.203
lab4: node 10.7.12.204
同时lab1-lab3 部署了ceph集群
vip(loadblancer ip): 10.7.12.200
2 基础环境配置
2.1 安装docker
v1.11.x版本推荐使用docker v17.03,配置国内docker源(daocloud或者aliyun):1
2
3
4
5
6
7
8sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
https://download.daocloud.io/docker/linux/centos/docker-ce.repo
sudo yum install -y -q --setopt=obsoletes=0 docker-ce-17.03.2.ce* docker-ce-selinux-17.03.2.ce*
sudo systemctl enable docker
sudo systemctl start docker
sudo service docker status
2.2 配置国内 docker 镜像加速器
1 | # 加速镜像下载(或者配置aliyun) |
2.3 安装 kube* (所有节点)
1 | # 配置源,使用阿里镜像安装 |
2.4 基础系统参数配置
1 | # 关闭 selinux |
3 高可用组件配置
配置haproxy和keepalived,这里我们选取了lab1-lab3三台机器,作为 haproxy+keepalived 集群, 为k8s集群提供vip服务(高可用服务),此章节需要在节点lab1,lab2,lab3操作
3.1 haproxy配置
拉取镜像并修改haproxy配置
1 | # 拉取haproxy镜像 |
启动并查看服务状态
1 | # 启动haproxy |
3.2 keepalived 配置
这里选取osixia维护的keepalived镜像
拉取并启动服务
1 | # 拉取keepalived镜像 |
查看keepalived服务状态
1 | # 查看日志,会看到两个成为backup 一个成为master |
4 配置启动kubelet
如下操作在所有节点操作1
2
3
4
5
6
7
8
9
10
11
12# 配置kubelet使用国内pause镜像
# 配置kubelet的cgroups
# 获取docker的cgroups
DOCKER_CGROUPS=$(docker info | grep 'Cgroup' | cut -d' ' -f3)
echo $DOCKER_CGROUPS
cat >/etc/sysconfig/kubelet<<EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=$DOCKER_CGROUPS --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.1"
EOF
# 启动
systemctl daemon-reload
systemctl enable kubelet && systemctl restart kubelet
5 部署集群
配置master节点
5.1 配置第一个master节点
如下操作在lab1节点操作
生成 kubeadm 需要的配置文件
1 | # 1.11.0 版本 centos 下使用 ipvs 模式会出问题 |
初始化
1 | # 提前拉取镜像 |
初始化结束之后,按照提示,配置kube config
1 | rm -rf $HOME/.kube |
同时,这里会提示部署网路插件,这里放在第6步操作
打包ca证书到其他master节点
1 | # 打包ca相关文件上传至其他master节点 |
5.2 配置第二个master节点
如下操作在lab2节点操作
生成 kubeadm 需要的配置文件
1 | # 生成配置文件 |
配置kubelet
1 | kubeadm alpha phase certs all --config kubeadm-master.config |
添加etcd到集群中
1 | CP0_IP="10.7.12.201" |
配置master加入集群
1 | # 提前拉取镜像, 可多次执行 |
5.3 配置第三个master节点
生成 kubeadm 需要的配置文件
1 | # 生成配置文件 |
配置kubelet
1 | kubeadm alpha phase certs all --config kubeadm-master.config |
添加etcd到集群中
1 | CP0_IP="10.7.12.201" |
配置master加入集群
1 | # 提前拉取镜像 |
5.4 查看node节点
1 | kubectl get nodes |
只有网络插件也安装配置完成之后,才能会显示为ready状态
5.5 设置master为可调度状态
现在可以设置master允许部署应用pod,参与工作负载,现在可以部署其他系统组件。如 dashboard, efk等1
kubectl taint nodes --all node-role.kubernetes.io/master-
6 网络插件部署
6.1 配置使用网络插件
选择任意master节点操作
6.2 下载配置
1 | mkdir flannel && cd flannel |
6.3 修改配置
1 | # 此处的ip配置要与上面kubeadm的pod-network一致 |
6.4 启动并查看
1 | kubectl apply -f kube-flannel.yml |
7 添加node节点
我们在初始化第一个master节点的时候,返回了一个加node的命令:1
kubeadm join 10.7.12.200:8443 --token yzb7v7.dy40mhlljt1d48i9 --discovery-token-ca-cert-hash sha256:61ec309e6f942305006e6622dcadedcc64420e361231eff23cb535a183c0e77a
如果丢失或已过期可以通过如下获取加入方式1
2
3
4kubeadm token create --print-join-command
或者
token=$(kubeadm token generate)
kubeadm token create $token --print-join-command --ttl=0
8 集群基础环境测试
测试容器间的通信和DNS
配置好网络之后,kubeadm会自动部署coredns
如下测试可以在配置kubectl的节点上操作
1 |
|
9 负载组件切换
如果kube-proxy用iptables想切换到到ipvs可以直接修改kube-proxy configmap即可1
2
3
4
5
6
7
8
9kubectl edit configmap kube-proxy -n kube-system
ipvs:
minSyncPeriod: 0s
scheduler: ""
syncPeriod: 30s
kind: KubeProxyConfiguration
metricsBindAddress: 127.0.0.1:10249
mode: "ipvs" # 加上这个或iptables
nodePortAddresses: null
要重启kube-proxy的容器
10 部署Kubernetes Dashboard
10.1 获取yaml
下载官方提供的 Dashboard 组件部署的 yaml 文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
10.2 修改 yaml 文件
修改image 为国内地址:
k8s.gcr.io 修改为 registry.cn-hangzhou.aliyuncs.com/google_containers,后续所有 yaml 文件中,只要涉及到 image 的,都需要做同样的修改,因为国内 k8s.gcr.io 这个地址被墙了。
修改 yaml 文件中的 Dashboard Service,暴露服务使外部能够访问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
29kind: Service
apiVersion: v1jiqun
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
ports:
- port: 443
targetPort: 8443
selector:
k8s-app: kubernetes-dashboard
修改为
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
ports:
- port: 443
targetPort: 8443
nodePort: 31111
selector:
k8s-app: kubernetes-dashboard
type: NodePort
10.3 启动 Dashboard
1 | kubectl apply -f kubernetes-dashboard.yaml |
10.4 访问 Dashboard
地址: https://
或者访问如下地址:
https://10.7.12.200:8443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy
10.5 创建能够访问 Dashboard 的用户
新建文件 account.yaml ,内容如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20# Create Service Account
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kube-system
# Create ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kube-system
10.6 获取登录 Dashboard 的令牌 (Token)
1 | kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}') |
输出如下1
2
3
4
5
6
7
8
9
10
11
12
13Name: admin-user-token-f6tct
Namespace: kube-system
Labels: <none>
Annotations: kubernetes.io/service-account.name=admin-user
kubernetes.io/service-account.uid=81cb9047-7087-11e8-95da-00163e0c5bd1
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1025 bytes
namespace: 11 bytes
token: <超长字符串>
参考文档:
https://kubernetes.io/docs/setup/independent/install-kubeadm/
https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init/
https://kubernetes.io/docs/setup/independent/high-availability/
https://sealyun.com/post/k8s-ipvs/