服务网格之基于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

猜你喜欢

转载自www.cnblogs.com/ListenFly/p/12733967.html