1 | author: yewei_andy |
部署k8s分布式
主机配置:
虚拟机方案:
- 使用虚拟机部署3个一样的centos7或者ubuntu虚拟机
- 配置2张网卡
- 一张用来主机和虚拟机通讯(host only 网卡),master和node节点通信也是使用这张网卡
- 一张用来nat和外网通信
三台物理机方案:
- 三台内网的主机即可,centos7或者ubuntu
配置docker的代理(主要用来拉取镜像使用)
1 | mkdir -p /etc/systemd/system/docker.service.d |
测试配置
1
2docker info | grep Proxy # 有输出说明配置成功
docker pull gcr.io/google-containers/hello-world # pull 成功代表代理器工作正常。
配置终端代理(如果有需要)
全局终端http/https代理:
1 | cat <<EOF >>/etc/environment |
仅限当前shell生效的代理(使用export):
1 | export http_proxy="http://{http代理地址}:8118/" |
修改host.conf文件
修改这个文件的目的在于使用主机名都能访问,不需要输入ip地址
- 三台机都要设置
1 | #192.168.56.101 yeweinode1 |
关闭防火墙
由于k8s会大量修改防火墙的配置,因此在使用k8s的时候尽量关闭iptables或者防火墙
1 | systemctl stop firewalld |
关闭selinux
1 | # 临时禁用 |
关闭swap
1 | # 临时关闭 |
如果不想关闭swap的话,需要做以下操作:
kubeadm 启动时候需要加入参数
1
--ignore-preflight-errors=swap
修改
/etc/systemd/system/kubelet.service.d/10-kubeadm.conf
在这个文件加入以下代码:
1
Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"
使得最后看起来像这样:
命令行程序安装(安装kubectl kubeadm kubelet三个组件):
使用centos:
- 配置软件源
1 | cat <<EOF > /etc/yum.repos.d/kubernetes.repo |
- 安装kubelet kubeadm kubectl
1 | yum install -y kubelet kubeadm kubectl |
使用ubuntu:
1 | apt-get update && apt-get install -y apt-transport-https |
使用kubeadm启动k8s
- 在node1(master)中执行
1 | kubeadm init --apiserver-advertise-address={这里填写node1的host-only网卡的地址} --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=swap |
--apiserver-advertise-address=192.168.56.101
绑定 apiserver 到 master 节点的 Host-Only 适配器的地址,默认是绑到 NAT 的地址上,这样其他机器是永远也访问不到的。--pod-network-cidr=10.244.0.0/16
指定 pod 网络地址空间,我们使用 flannel 组件必须使用这个空间- 等待node1执行结束,会有以下的输出:
配置kubectl,使得能连上k8s的apiserver
这时候需要使用kubectl接入kubernets的api,在我们刚刚的kubeadm init时候,程序已经为我们创建了kubectl的配置文件,这时候我们只需要export到环境变量即可
1 | 1.如果是root用户的话 |
以上的操作其实是把kubectl需要用到的配置文件配置到kubectl的配置当中
当完成了以上操作后,kuberctl已经能使用了
- 在终端输入:
1 | kubectl cluster-info |
- 会有类似下面的输出:
这时候kubectl命令是已经能正常连上api server,集群也处于可用状态
安装flannel网络
- 可以通过修改kube-flannel.yml文件去修改flannel的默认监听端口
1 | wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml |
- 测试配置
1 | kubectl get pods --all-namespaces -o wide |
如图:
让master节点也参与调度
如果需要在master也进行pod调度(k8s默认不进行pod调度) 执行以下指令
1 | # taint命令用于配置污点 |
其他节点加入集群
- 此时需要在要加入集群的服务器上面执行以下指令(当然网段要能访问到,并且已经安装了kubeadm)
1 | kubeadm join xxxxxxxxx:6443 --token xxxxxx.xxxxxxxx --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxx |
这时候会出现以下的信息,说明已经成功加入了集群
安装和配置kubernetes-dashboard
安装kubernetes-dashboard
下载官方kubernetes-dashboard的k8s资源文件
1
curl -L http://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml -O
把资源文件应用到k8s集群
1
kubectl create -f kubernetes-dashboard.yaml
等待dashboard 完全启动,使用以下命令确认
- 此时,kubernetes-dashboard已经部署
配置kubernetes-dashboard的rbac策略
kubernetes-dashboard比较坑的地方在于
如果没有配置策略,那么在启动kubernetes-dashboard的时候会出现很多的warning,然后即使能登陆到kubernetes-dashboard,也无法访问里面的资源
配置rbac策略
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#admin-user-admin.rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kube-system
# Create ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
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应用rbac策略到k8s集群
1
kubectl create -f admin-user-admin.rbac.yaml
得到用于登陆dashboard的secret
- 运行命令
1 | kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user|awk '{print $1}') |
- 会得到以下的token
1 | Name: admin-user-token-hmctl |
使用kubectl proxy在本地打开dashboard
1 | kubectl proxy |
- 访问dashboard
本地浏览器地址栏输入:
localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
会出现如下的页面:
输入刚刚拿到的令牌
如果没有配置rbac策略,在这个时候,使用令牌即使以admin-user登陆进去,也不能访问里面的资源
然后进入dashboard界面,如下:
此时,已经可以正常访问了