服务网格之基于kubeadm安装k8s 和 DashBoard
前言:
微服务还没玩溜,服务网格的出现已让我佩服三连。本着,不作死就不会死的原则,我进行了深(ru)度(men)学习。本系列一共有4篇文章组成,分别是《服务网格之基于kubeadm安装k8s 和 DashBoard》、《服务网格之基于Kubernetes安装Istio》、《服务网格之Istio基础实践》、《服务网格之使用Istio开发微服务》。
学习的道路是坎坷的,但是这条路却是一个坑接一个坑,坑到你怀疑人生。于是,本文集结了网络上最佳实践以及本人的踩坑实践,总结出,无坑无套路的安装k8s教程,掌声鼓励。
开头语:
注意:如果k8s状态错误,注意检查kubelet服务状态,注意设置的host是否生效
#查看kubelet日志信息
journalctl -xeu kubelet
环境:安装环境为Hyper-V的虚拟机,运行CentOS 7,Kubernetes为1.18
机器的基础设置
创建虚拟机。
使用Hyper-V创建虚拟机,并且安装好CentOS。Hyper-V中的CentOS如何上外网,是个问题。
最简单的方法是,在Hyper-V中创建一个网络,然后虚拟机使用创建的网络。同时在自己物理机的网络中共享给Hyper-V中创建的网络即可,这样虚拟机即可访问外网,如图:
设置hostname,可以只在一个机器设置,也可以在所有的节点上设置。
#主节点执行 hostnamectl set-hostname k8s-master #从节点上执行 hostnamectl set-hostname k8s-node1
修改/etc/hosts文件,映射hostname和ip地址。
vim /etc/hosts ##追加如下内容到文件中 ip地址 k8s-master ip地址 k8s-node1
设置静态ip地址,防止每次重启ip变掉。
#切换到此路径 cd /etc/sysconfig/network-scripts #查看文件信息ls#编辑第一个文件,一般的名称为 ifcfg-ens+数字,我本机的是ifcfg-eth0 vim ifcfg-eth0 BOOTPROTO="static" #修改为静态 IPADDR=192.168.242.138 #可自行修改 GATEWAY=192.168.242.2 #和物理机上创建的网络中的网关一致NETMASK=255.255.255.0 ONBOOT=yes
设置DNS
vim /etc/resolv.conf #写入如下内容 nameserver 192.168.242.2 #和网关一致
重启网络服务
service network restart
测试
ping www.baidu.com
关闭并禁用防火墙
systemctl stop firewalld
systemctl disable firewalld
关闭SeLinux
关闭selinux以允许容器访问宿主机的文件系统。
#禁用 sed -i 's/enforcing/disabled/' /etc/selinux/config #验证是否关闭 cat /etc/selinux/config
禁用swap
如果不关闭kubernetes 运行会出现错误,即使安装成功了,node 重启后也会出现kubernetes server 运行错误。
#编辑文件,使用#注释 swap
vim /etc/fstab
重启电脑
reboot
查看swap
free -h
查看selinux状态
getenforce Disabled
Docker的设置
配置Docker的yum安装源,并安装docker-ce。
配置docker安装源
yum -y install yum-utils yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
查看可用的版本,选择自己合适的版本即可
yum list docker-ce --showduplicates|grep "^doc"|sort -r
安装
yum -y install docker-ce-18.06.1.ce-3.el7
启动docker
systemctl start docker
systemctl enable docker
#验证docker的状态
systemctl status docker
安装k8s相关
配置kubernetes为阿里云yum镜像
echo "[kubernetes]name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 pgcheck=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg" > /etc/yum.repos.d/kubernetes.repo
安装kubernetes组件
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes systemctl enable kubelet
#验证kubelet状态
systemctl status kubelet
前面的命令要在master和每个node上分别执行一遍。
安装kubernetes master节点
注意,如果是单节点的Kubernetes,则要设置允许在master节点上分配pod,操作如下
kubectl taint nodes --all node-role.kubernetes.io/master-
列出需要安装的镜像列表
kubeadm config images list
安装拉取工具
curl -Lo /usr/local/bin/azk8spull https://github.com/xuxinkun/littleTools/releases/download/v1.0.0/azk8spullchmod +x /usr/local/bin/azk8spull
使用方法:azk8spull k8s.gcr.io/pause:3.1
使用azk8spull工具依次pull需要的镜像
网络配置
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables echo 1 > /proc/sys/net/ipv4/ip_forward
初始化master
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
注意:必须设置--pod-network-cidr,ip地址最好为上述所写,因为这个也和flannel的地址相同
安装成功之后,会输出join集群的语句和token值,如下:
Then you can join any number of worker nodes by running the following on each as root: kubeadm join 192.168.137.205:6443 --token 66ym67.0wdrafrclpzuwk74 --discovery-token-ca-cert-hash sha256:e7b32df67ec6d75bf79c94499a40450aa5e33f6b23365cd7f0f6eaeba4f15c70
可以保存,用于安装node
如果安装失败,可以进行重置
kubeadm reset
配置授权信息
init成功后,即master node初始化成功,成功后会提示一些操作。(如果失败,根据问题再做改进)。
要开始使用群集,您需要运行以下命令:
即配置授权信息,主要是为了保存相关的配置信息在用户目录下,这样不用每次都输入相关的认证信息。
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
检查kubelet配置
cat /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS=--cgroup-driver=cgroupfs --network-plugin=cni
安装flannel
Flannel是 CoreOS 团队针对 Kubernetes 设计的一个覆盖网络(Overlay Network)工具,其目的在于帮助每一个使用 Kuberentes 的 CoreOS 主机拥有一个完整的子网。
sysctl net.bridge.bridge-nf-call-iptables=kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml systemctl restart docker kubectl get nodes
安装node
如果只想安装master,则可以跳过
1.安装镜像
2.网络配置
3.用master中保存的语句将node加入到集群
kubeadm join 192.168.137.205:6443 --token 66ym67.0wdrafrclpzuwk74 --discovery-token-ca-cert-hash sha256:e7b32df67ec6d75bf79c94499a40450aa5e33f6b23365cd7f0f6eaeba4f15c70
如果忘记,可以用以下语句获取
kubeadm token create --print-join-command
安装dashboard
获取dashboard的yaml文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
如果有墙,可以先把文件下载下来,然后复制到服务器
安装dashboard到k8s
kubectl apply -f kubernetes-dashboard.yaml
创建Admin用户
kubectl create clusterrolebinding admin --clusterrole=cluster-admin --user=admin
绑定Admin用户到kubernetes-dashboard服务
####如提示已经存在,则修改 clusterrolebinding 后的名称即可
kubectl create clusterrolebinding kubernetes-dashboard --clusterrole=cluster-admin --serviceaccount=kube-system:kubernetes-dashboard
进行端口转发
默认情况下,dashboard只能在localhost访问,所以需要对端口转发
####这样使用https://ip:10443端口访问即可 nohup kubectl port-forward -n kubernetes-dashboard service/kubernetes-dashboard 10443:443 --address 0.0.0.0 &
经过一系列操作之后,可以通过https://ip:10443进行访问,但是此时是只能通过token访问的,token获取方式如下:
####执行如下命令,获取所有的secret,找到名字为dashboard-admin的kubectl get secrets NAME TYPE DATA
AGEdashboard-admin-sa-token-zhjng kubernetes.io/service-account-token 3 16h
default-token-vqjcd kubernetes.io/service-account-token 3 17h ####执行如下命令,获取Token kubectl describe secret dashboard-admin-sa-token-zhjng
复制输出的token到登录界面即可。
启用Basic Auth(用户名和密码)
默认是token方式,比较繁琐
编辑kubernetes-dashboard.yaml文件(默认在/etc/kubernetesdashboard下)
####找到kind为Deployment下的containers-->节点,加入如下配置,默认为token
- --authentication-mode=basic
保存退出,现在访问https://ip:10443会有一个用户名和密码的输入框,可以登录成功,但是看不到数据。
通过kubectl getpods -n kubernetes-dashboard 查看DashBoard的pods状态,如果状态不为 Running,则表明其实失败或启动中。可以通过 kubectl describe pods -n kubernetes-dashboard进行查看,确定是否存在异常,如果发现最后的状态是Pull Image,表明拉取镜像太慢,可以手动通过 azk8spull imagename或者是通过docker pull imagename手动拉取。
Tips:强制替换执行yaml文件
kubectl replace --force -f kubernetes-dashboard.yaml
解决访问安全问题
经过上边的操作,可以使用用户名和密码登录,但是看不到数据,继续折腾。创建包含用户名和密码的csv文件
####格式是 密码,用户名,uid echo "admin,admin,1" > /etc/kubernetes/config/basic_auth.csv
编辑kube-apiserver.yaml文件
vim /etc/kubernetes/mainfests/kube-apierver.yaml ####找到-kube-apiserver节点,加入如下配置,注意层级 - --basic-auth-file=/etc/kubernetes/config/k8sdashboardauth.csv - --authorization-mode=Node,RBAC ####由于使用了配置文件,则需要把宿主机器的config文件夹挂载到容器中 ####1.在配置文件中找到volumes节点,加入如下配置,注意层级 - hostPath: path: /etc/kubernetes/config type: DirectoryOrCreate name: k8s-auth-config ####2.在配置文件中找到volumeMounts节点,加入如下配置,注意层级 - mountPath: /etc/kubernetes/config name: k8s-auth-config readOnly: true ####退出编辑,保存文件
这个时候,退出登录DashBoard,重新登录,不出意外,可以看到所有的数据了,到此为止,DashBoard实现了使用用户名和密码登录。
注意:不管是启动的kubernest相关的组件,还是DashBoard,都是运行在docker中的容器,当出现问题的时候,可以使用docker logs 容器名称(容器id)查看日志,或者使用 kubectl pods -n namespace方式查看pod的信息,进行确定问题所在。
总结:
通过一步一步,我们终于把kubernetes给安装成功了,同时也安装了一个dashboard可以可视化操作,也开启了用户名和密码方式的登录。到这里,kubernetes的安装工作就完成了,相信你跟着上述的步骤,可以成功的安装成功。
参考文章
https://blog.csdn.net/jholy/article/details/84962357