简介
环境信息(采用一个 master 节点 + 两个 node 节点)
软件版本
master 192.168.2.110
node-1 192.168.2.112
node-2 192.168.2.113
采用 kubeadm 安装
kubernetes v1.9
docker:17.03
kubeadm:v1.9.0
kube-apiserver:v1.9.0
kube-controller-manager:v1.9.0
kube-scheduler:v1.9.0
k8s-dns-sidecar:1.14.7
k8s-dns-kube-dns:1.14.7
k8s-dns-dnsmasq-nanny:1.14.7
kube-proxy:v1.9.0
etcd:3.1.10
pause :3.0
flannel:v0.9.1
kubernetes-dashboard:v1.8.1
kubeadm 为 kubernetes 官方推荐的自动化部署工具,他将 kubernetes 的组件以 pod 的形式部署在 master 和 node 节点上,并自动完成证书认证等操作.
因为 kubeadm 默认要从 google 的镜像仓库下载镜像,但目前国内无法访问 google 镜像仓库,所以这里我提交将镜像下好了,只需要将离线包的镜像导入到节点中就可以了.
开始安装
所有节点操作
下载
链接: https://pan.baidu.com/s/1c2O1gIW 密码: 9s92
比对 md5 解压离线包
MD5 (k8s_images.tar.bz2) = b60ad6a638eda472b8ddcfa9006315ee
解压下载下来的离线包
安装 docker-ce17.03(kubeadmv1.9 最大支持 docker-ce17.03)
1
tar -xjvf k8s_images.tar.bz2
修改 docker 的镜像源为国内的 daocloud 的.
1
2
rpm -ihv docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch.rpm
rpm -ivh docker-ce-17.03.2.ce-1.el7.centos.x86_64.rpm
1
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://a58c8480.m.daocloud.io
启动 docker-ce
绑定 hosts
1
systemctl start docker && systemctl enable docker
将 master 和 node-1,node-2 绑定 hosts
master 节点与 node 节点做互信
关闭防火墙和 selinux
1
2
3
[root@master ~]# ssh-keygen
[root@master ~]# ssh-copy-id node-1
[root@master ~]# ssh-copy-id node-2
配置系统路由参数, 防止 kubeadm 报路由警告
1
systemctl stop firewalld && systemctl disable firewalld
vim /etc/selinux/config
SELINUX=disabled
1
setenforce 0
导入镜像
1
2
3
4
5
echo "
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
">> /etc/sysctl.conf
sysctl -p
安装安装 kubelet kubeadm kubectl 包
1
2
3
4
5
6
7
8
9
10
11
docker load < /root/k8s_images/docker_images/etcd-amd64_v3.1.10.tar
docker load </root/k8s_images/docker_images/flannel\:v0.9.1-amd64.tar
docker load </root/k8s_images/docker_images/k8s-dns-dnsmasq-nanny-amd64_v1.14.7.tar
docker load </root/k8s_images/docker_images/k8s-dns-kube-dns-amd64_1.14.7.tar
docker load </root/k8s_images/docker_images/k8s-dns-sidecar-amd64_1.14.7.tar
docker load </root/k8s_images/docker_images/kube-apiserver-amd64_v1.9.0.tar
docker load </root/k8s_images/docker_images/kube-controller-manager-amd64_v1.9.0.tar
docker load </root/k8s_images/docker_images/kube-scheduler-amd64_v1.9.0.tar
docker load < /root/k8s_images/docker_images/kube-proxy-amd64_v1.9.0.tar
docker load </root/k8s_images/docker_images/pause-amd64_3.0.tar
docker load < /root/k8s_images/docker_images/kubernetes-dashboard_v1.8.1.tar
master 节点操作
1
2
3
4
rpm -ivh socat-1.7.3.2-2.el7.x86_64.rpm
rpm -ivh kubernetes-cni-0.6.0-0.x86_64.rpm kubelet-1.9.9-9.x86_64.rpm kubectl-1.9.0-0.x86_64.rpm
rpm -ivh kubectl-1.9.0-0.x86_64.rpm
rpm -ivh kubeadm-1.9.0-0.x86_64.rpm
启动 kubelete
开始初始化 master
1
systemctl enable kubelet && sudo systemctl start kubelet
kubernetes 默认支持多重网络插件如 flannel,weave,calico,这里使用 flanne,就必须要设置-pod-network-cidr 参数,10.244.0.0/16 是 kube-flannel.yml 里面配置的默认网段,如果需要修改的话,需要把 kubeadm init 的-pod-network-cidr 参数和后面的 kube-flannel.yml 里面修改成一样的网段就可以了.
1
kubeadm init --kubernetes-version=v1.9.0 --pod-network-cidr=10.244.0.0/16
发现 kubelet 启动不了
查看日志 / var/log/message
发现原来是 kubelet 默认的 cgroup 的 driver 和 docker 的不一样,docker 默认的 cgroupfs,kubelet 默认为 systemd
修改
1
vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
重启 reload
查看状态
1
systemctl daemon-reload && systemctl restart kubelet
此时记得将环境 reset 一下
执行
1
kubeadm reset
在重新执行
1
kubeadm init --kubernetes-version=v1.9.0 --pod-network-cidr=10.244.0.0/16
将 kubeadm join xxx 保存下来,等下 node 节点需要使用
如果忘记了,可以在 master 上通过 kubeadmin token list 得到
按照上面提示,此时 root 用户还不能使用 kubelet 控制集群需要,配置下环境变量
对于非 root 用户
对于 root 用户
1
2
3
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
也可以直接放到~/.bash_profile
1
export KUBECONFIG=/etc/kubernetes/admin.conf
source 一下环境变量
1
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
1
source ~/.bash_profile
kubectl version 测试
安装网络,可以使用 flannel,calico,weave,macvlan 这里我们用 flannel.
下载此文件
1
wget https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml
或直接使用离线包里面的
若要修改网段,需要 kubeadm -pod-network-cidr = 和这里同步
vim kube-flannel.yml
修改 network 项
执行
1 "Network": "10.244.0.0/16",
node 节点操作
1
kubectl create -f kube-flannel.yml
使用刚刚 kubeadm 后的 kubeadm join -xxx
多次加入报错查看 / var/log/message 日志.
1
kubeadm join --token 361c68.fbafaa96a5381651 192.168.2.110:6443 --discovery-token-ca-cert-hash sha256:e5e392f4ce66117635431f76512d96824b88816dfdf0178dc497972cf8631a98
这个错是因为没有配置前面 sysctl 的 router 的环境变量
发现 node 节点启动不了 flannel 容器,查看容器 log 发现是 host 上没有默认路由,在网卡配置文件里面设置好默认路由.
加入成功
在 master 节点上 check 一下
kubernetes 会在每个 node 节点创建 flannel 和 kube-proxy 的 pod
测试集群
在 master 节点上发起个创建应用请求
这里我们创建个名为 httpd-app 的应用,镜像为 httpd,有两个副本 pod
1
kubectl run httpd-app --image=httpd --replicas=2
检查 pod
可以看见 pod 分布在 node-1 和 node-2 上
因为创建的资源不是 service 所以不会调用 kube-proxy
直接访问测试
至此 kubernetes 基本集群安装完成.
部署 kubernetes-dashboard
kubernetes-dashboard 是可选组件,因为,实在不好用,功能太弱了.
建议在部署 master 时一起把 kubernetes-dashboard 一起部署了, 不然在 node 节点加入集群后,kubernetes-dashboard 会被 kube-scheduler 调度 node 节点上,这样根 kube-apiserver 通信需要额外配置.
下载 kubernetes-dashboard 的配置文件或直接使用离线包里面的 kubernetes-dashboard.yaml
1
wget https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
修改 kubernetes-dashboard.yaml
如果需要让外面访问需要修改这个 yaml 文件端口类型为 NodePort 默认为 clusterport 外部访问不了,
nodeport 端口范围 30000-32767
32666 就是我的映射端口,根 docker run -d xxx:xxx 差不多
创建 kubernetes-dashboard
访问
1
kubectl create -f kubernetes-dashboard.yaml
1 https: //master_ip:32666
默认验证方式有 kubeconfig 和 token,这里我们都不用.
这里我们使用 basicauth 的方式进行 apiserver 的验证
创建 / etc/kubernetes/manifests/pki/basic_auth_file 用于存放用户名和密码
给 kube-apiserver 添加 basic_auth 验证
#user,password,userid
admin,admin,2
1
vim /etc/kubernetes/manifests/kube-apiserver.yaml
加上这行
更新 kube-apiserver 容器
授权
1
kubectl apply kube-apiserver.yaml
k8s1.6 后版本都采用 RBAC 授权模型
给 admin 授权
默认 cluster-admin 是拥有全部权限的,将 admin 和 cluster-admin bind 这样 admin 就有 cluster-admin 的权限.
那我们将 admin 和 cluster-admin bind 在一起这样 admin 也拥用 cluster-admin 的权限了
查看
1
kubectl create clusterrolebinding login-on-dashboard-with-cluster-admin --clusterrole=cluster-admin --user=admin
1
kubectl get clusterrolebinding/login-on-dashboard-with-cluster-admin -o yaml
在此访问 https://master:32666
选基本,就可以通过用户名和密码访问了
创建个应用测试
部署成功
参考链接:
https://kubernetes.io/docs/setup/independent/install-kubeadm/ http://tonybai.com/2017/07/20/fix-cannot-access-dashboard-in-k8s-1-6-4/
来源: http://www.bubuko.com/infodetail-2454929.html