搭建kubernetes集群--(包含dashboard),看完可以部署任何版本的kubernetes

环境准备工作:

1、搭建k8s集群之前首先准备好≥3台的机器(本示例用的是阿里云主机)

2、并做好免密登陆,搭建时各种操作会便捷很多

制作秘钥:ssh-keygen -t rsa

分发:ssh-copy-id -i ~/.ssh/id_rsa.pub 172.19.90.87<各个node节点IP都传一遍>

3、设置好主机名和时间同步,虚拟机可能问题出现比较多,阿里云一般都默认同步

[root@k8s-master01 ~]# for i in k8s-node01 k8s-node02 k8s-node03;do echo $i && date;done && hostname && date
k8s-node01
Mon Dec 24 13:42:57 CST 2018
k8s-node02
Mon Dec 24 13:42:57 CST 2018
k8s-node03
Mon Dec 24 13:42:57 CST 2018
k8s-master01
Mon Dec 24 13:42:57 CST 2018

4、设置主机名,规划一下主机名,有集群的概念思想

命令:

[root@k8s-master01 ~]# hostnamectl set-hostname k8s-master01

172.19.96.11    k8s-master01---------->hostnamectl set-hostname k8s-master01

172.19.90.87    k8s-node01 ---------->hostnamectl set-hostname k8s-node01

172.19.90.88    k8s-node02---------->hostnamectl set-hostname k8s-node02

172.19.90.89    k8s-node03---------->hostnamectl set-hostname k8s-node03

5、修改master和各个node的hosts文件:vim /ets/hosts      用于地址解析         

    添加如下内容

[root@k8s-master01 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

##集群##
172.19.96.11    k8s-master01
172.19.90.87    k8s-node01
172.19.90.88    k8s-node02
172.19.90.89    k8s-node03

部署基础组件前的准备工作

Master和node节点全部都要安装的程序如下,每个服务器上都执行一次

安装之前配置一下yum仓库,因为默认的仓库源版本可能陈旧或者没有yum源,所以我们用阿里云的镜像站资源配置一下yum-repo

[root@k8s-master01 ~]# cd /etc/yum.repos.d/

Docker-ce的直接阿里云官方找到了 现成的直接下载下来

[root@k8s-master01 ]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

kubernetes的repo没找到链接,内容直接贴出来如下:

[root@k8s-master01 ]# vim /etc/yum.repos.d/kubernetes.repo

[kubernetes]

name=Kubernetes Repo

baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/

gpgcheck=1

gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg

enabled=1

保存退出

[root@k8s-master01 ]#  wget https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg

[root@k8s-master01 ]#  rpm --import yum-key.gpg

[root@k8s-master01 ]#  wget https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

[root@k8s-master01 ]#  rpm --import rpm-package-key.gpg

把yum源配置到各个node节点上,或者刚才的步骤挨个在主机上执行一遍也行

[root@k8s-master01 ]# scp kubernetes.repo docker-ce.repo k8s-node01:/etc/yum.repos.d/

[root@k8s-master01 ]# scp kubernetes.repo docker-ce.repo k8s-node02:/etc/yum.repos.d/

[root@k8s-master01 ]# scp kubernetes.repo docker-ce.repo k8s-node03:/etc/yum.repos.d/

在各node节点都需要执行:

[root@k8s-node01 ]#  wget https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg

[root@k8s-node01 ]#  rpm --import yum-key.gpg

[root@k8s-node01 ]#  wget https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

[root@k8s-node01 ]#  rpm --import rpm-package-key.gpg

开始安装各个组件

Master和node各节点都需要执行

[root@k8s-master01 ]#  yum install -y docker-ce kubelet kubeadm kubectl (在master上执行)

[root@k8s-node01 ]#  yum install -y docker-ce kubelet kubeadm kubectl(每个node上都要执行)

Master和各node节点都需要关闭防火墙,防火墙相关操作

[root@k8s-master01 ~]# systemctl stop firewalld.service
[root@k8s-master01 ~]# systemctl disable difewalld.service

Master和各node节点都需要开启docker

[root@k8s-master01 ]# systemctl daemon-reload

[root@k8s-master01 ]# systemctl start docker

Master和各node节点都需要设置docker-ce的开机自启动

systemctl enable docker kubelet

 

验证一下iptables和ip6tables

[root@k8s-master01 ~]# cat /proc/sys/net/bridge/bridge-nf-call-ip6tables

1

[root@k8s-master01 ~]# cat /proc/sys/net/bridge/bridge-nf-call-iptables

1

这里如果cat的内容不是1的话则修改路径下的文件,内容改成1然后保存

修改kubelet配置文件,不知道kubelet配置文件在哪儿用命令查看一下kubelet的文件位置:

[root@k8s-master01 ~]#  rpm -ql kubelet

/etc/kubernetes/manifests

/etc/sysconfig/kubelet

/etc/systemd/system/kubelet.service

/usr/bin/kubelet

[root@k8s-master01 ~]# cat /etc/sysconfig/kubelet

KUBELET_EXTRA_ARGS="--fail-swap-on=false"

[root@k8s-master01 ~]# cat /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--fail-swap-on=false"

[root@k8s-master01 ~]# rpm -ql kubeadm

/etc/systemd/system/kubelet.service.d/10-kubeadm.conf

/usr/bin/kubeadm

 

写一个下载镜像的脚本,因为直接去国外的地址下载会被墙

===========================================================

#!/bin/bash
images=(kube-apiserver:v1.12.0 kube-controller-manager:v1.12.0 kube-scheduler:v1.12.0 kube-proxy:v1.12.0 pause:3.1 etcd:3.2.24 coredns:1.2.2 kubernetes-dashboard-amd64:v1.10.0 tiller:v2.6.1 addon-resizer:1.8.4 flannel:v0.10.0-amd64 grafana:5.3.4 heapster-influxdb-amd64:v1.5.2 metrics-server-amd64:v0.3.1 )

for ima in ${images[@]}
do
   docker pull   registry.cn-shanghai.aliyuncs.com/wangting/$ima
   docker tag    registry.cn-shanghai.aliyuncs.com/wangting/$ima   k8s.gcr.io/$ima
   docker rmi  -f  registry.cn-shanghai.aliyuncs.com/wangting/$ima
   docker tag 0ebffe5ba8a7 gcr.io/kubernetes-helm/tiller:v2.6.1
   docker tag f0fad859c909 quay.io/coreos/flannel:v0.10.0-amd64
done

===========================================================

脚本执行完毕,docker images查看一下,一下全部拉下来,非常的效率方便

[root@k8s-master01 ~]# bash -x kubernetes.sh

注意:这个镜像站是本人私人的,我不可能像官方那样出一个版本就更新一个版本到我的私人仓库,没这么多精力,目前仓库里有大量1.12和1.16两个版本的镜像,1.12用文档里的脚本,1.16就改一下images里的清单。其它版本则需要去找镜像资源。

Master和各node节点都需要执行一下脚本,一次把所需的镜像全部下载到位并打好标签

Master上执行kubeadm init命令;

[root@k8s-master01 ~]# kubeadm init --kubernetes-version=v1.12.0 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12

注意这里有多个坑,我安装的是kubernetes-version=v1.12.0,随着时间的过去,以后版本慢慢变成1.13,1.14等等等,这样yum install 安装的kubelet版本就未必是1.12的了,所以组件我上面推荐用阿里云的镜像repo,这样一般不会出现版本太老的,并且这条命令时间长了安装的时候版本需要注意变更,--kubernetes-version=v版本号,比如你要安装1.13.1,这样对应的镜像就需要用新的,这也是我一直反复说的镜像问题。

例如:

kubeadm init --kubernetes-version=v1.13.1 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12

随着--kubernetes-version版本涉及变化的镜像有:(xxxx代表你安装时体统提示你需要的镜像版本,根据提示替换成xxxx)

k8s.gcr.io/coredns:xxxx

k8s.gcr.io/kube-scheduler:xxxx

k8s.gcr.io/kube-apiserver:xxxx

k8s.gcr.io/kube-controller-manager:xxxx

k8s.gcr.io/kube-proxy:xxxx

需要下载最新的镜像:
docker pull gcr.io/google-containers/kube-apiserver:v1.15.2       这样拉取国内一般是肯定拉取不到的
对应的方式可以换成如下的方法拉取,拉到本地再tag一下
docker pull gcr.azk8s.cn/google-containers/kube-apiserver:v1.15.2

docker images 查看imageID
docker tag imageID k8s.gcr.io/kube-proxy:xxxx
docker tag imageID k8s.gcr.io/kube-controller-manager:xxxx
docker tag imageID k8s.gcr.io/kube-apiserver:xxxx
docker tag imageID k8s.gcr.io/kube-scheduler:xxxx
docker tag imageID k8s.gcr.io/coredns:xxxx

这样镜像处理好了再执行init才会OK

还有一个坑就是有些人搭建的时候用的是虚拟机搭建可能出现:

[ERROR Swap]: running with swap on is not supported. Please disable swap

如果出现这样的报错处理方式为:

[root@master ~]#  swapoff -a

然后执行init,基本都能解决上面的报错,如果还是不行则

[root@master ~]# vim /etc/fstab

把类似下面这行内容注释保存,再执行init

 

init执行成功后

(此命令执行成功后,在输出的内容里能会看到join的命令,复制一下备着有用!)

===

...

kubeadm join 172.19.96.11:6443 --token 9z9bo5.wh3bdd44rgpxbnkr --discovery-token-ca-cert-hash sha256:19a3f3804eb643ca4ffad56d272fe0da0b222f4567d16c61a9e885c1489cda32

 

所有节点node上执行这个kubeadm join 命令(注意这个kubeadm join里的秘钥每个人不一样,我文档命令不能复制粘贴去使用,命令来自于自己刚才执行kubeadm init出来的)

接下来一步简单但是容易被忽略:

将主节点中的【/etc/kubernetes/admin.conf】文件拷贝到从节点相同目录下,然后配置环境变量:

把/etc/kubernetes/admin.conf分发到各个节点

1、

2、

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile

3、立即生效

source ~/.bash_profile

基本框架搭建完成,开始搭建网络组建

此时整个k8s集群还缺少一个网络配置flannel

master上直接执行:kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

可以完成k8s集群的网络flannel配置,地址是GitHub官网上的yml,一般地址不会变,如果404了,可以把URL打开主页一步步去找到yml的路径再apply -f

至此k8s集群基本搭建完成了,检查一下:

[root@master ~]# kubectl get pod --all-namespaces

 

kubernetes搭建完毕,最后开启dashboard 页面访问,实现图形化

Master上执行

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended/kubernetes-dashboard.yaml

这里搭建dashboard有2个坑,一个是注意上面的地址官方可能会变,如果命令提示404等问题

打开https://github.com/kubernetes/dashboard/,在下图中的位置找到最新的连接复制执行

还一个坑依然还是镜像拉取的问题

跑起来了以后,做个配置修改如下:这个是用于集群外部访问,官网的配置文件默认的svc访问是ClusterIP

[root@k8s-master01 ~]# kubectl  edit service kubernetes-dashboard --namespace=kube-system

此命令修改页面访问的type形式,改成type: NodePort

如果你会编写yaml文件,也可以把在线的yaml  wget下来,编辑svc的type再apply -f

 

[root@k8s-master01 ~]# kubectl describe secret/$(kubectl get secret -nkube-system |grep admin|awk '{print $1}') -nkube-system

此命令获取dashboard的token,token用来后面页面访问使用

如果命令查不到

[root@master grafana]# kubectl get secret --all-namespaces|grep dashboard
kubernetes-dashboard   default-token-2qtqd                              kubernetes.io/service-account-token   3      2d18h
kubernetes-dashboard   kubernetes-dashboard-certs                       Opaque                                0      2d18h
kubernetes-dashboard   kubernetes-dashboard-csrf                        Opaque                                1      2d18h
kubernetes-dashboard   kubernetes-dashboard-key-holder                  Opaque                                2      2d18h
kubernetes-dashboard   kubernetes-dashboard-token-5mpfp                 kubernetes.io/service-account-token   3      2d18h

找到dashboard的token  secret  然后用describe查看

最后验证所有system的pod是否都成功跑了起来,如果还有部分没起来describe检查一下对应的pod看看什么问题

 

[root@k8s-master01 ~]# kubectl get svc -n kube-system

查看kubernetes-dashboard对外的端口是多少,此端口为外网访问的端口

https://47.101.205.45:32204          格式为:<https://对外的IP地址:get svc查到的端口>

效果如下图:

Dashoard部署完毕。

 

Helm包管理

Helm

    核心术语
        Chart     是一个helm程序包        可理解成类似yum的RPM包
        
        Reponsitory        Charts仓库    可理解成类似yum的repo源   https、http服务
        
        Release        特定的Chart部署于目标集群上的一个实例 可理解成类似yum安装的一个程序版本V
        
        流程大致为  Chart--> Config --> Release


    程序架构
        helm(客户端)--管理本地的Charts,有点像linux的yum命令,与Tiller服务器交互,发送Chart给Tiller, 
                               用以实例安装、查询、卸载等操作,同理于yum install、yum search、yum remove
        
        Tiller(服务端)--接收helm发来的Charts与Config,合并生成release,最终成功部署

在https://github.com/helm/helm/releases/tag/v2.15.2 版本页面上可以看到不同的系统环境下载的资源包:
Installation and Upgrading
Download Helm 2.15.2. The common platform binaries are here:

MacOS amd64 (checksum)
Linux amd64 (checksum)
Linux arm (checksum)
Linux arm64 (checksum)
Linux i386 (checksum)
Linux ppc64le (checksum)
Linux s390x (checksum)
Windows amd64 (checksum)

找到Linux amd64 (checksum),右键复制链接地址

[root@master ~]# mkdir helm
[root@master ~]# cd helm
[root@master helm]# wget https://get.helm.sh/helm-v2.15.2-linux-amd64.tar.gz
[root@master helm]# tar xf helm-v2.15.2-linux-amd64.tar.gz 
[root@master helm]# ls
helm-v2.15.2-linux-amd64.tar.gz  linux-amd64
[root@master helm]# cd linux-amd64/
[root@master linux-amd64]# ls
helm  LICENSE  README.md  tiller
[root@master linux-amd64]# mv helm /usr/bin/
[root@master linux-amd64]# helm --help
...#查看帮助,大致先了解一下功能

部署一个tiller-rbac

[root@master linux-amd64]# vim tiller-rbac.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  name: tiller
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: tiller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: tiller
    namespace: kube-system
[root@master linux-amd64]# kubectl apply -f tiller-rbac.yaml
serviceaccount/tiller created
clusterrolebinding.rbac.authorization.k8s.io/tiller created
[root@master linux-amd64]# kubectl get sa -n kube-system |grep tiller
tiller                               1         41s
[root@master linux-amd64]# 
[root@master linux-amd64]# docker pull gcr.azk8s.cn/kubernetes-helm/tiller:v2.15.2
[root@master linux-amd64]# docker tag gcr.azk8s.cn/kubernetes-helm/tiller:v2.15.2 gcr.io/kubernetes-helm/tiller:v2.15.2
[root@master linux-amd64]# 
[root@master linux-amd64]# 
[root@master linux-amd64]# helm init --service-account tiller
Creating /root/.helm 
Creating /root/.helm/repository 
Creating /root/.helm/repository/cache 
Creating /root/.helm/repository/local 
Creating /root/.helm/plugins 
Creating /root/.helm/starters 
Creating /root/.helm/cache/archive 
Creating /root/.helm/repository/repositories.yaml 
Adding stable repo with URL: https://kubernetes-charts.storage.googleapis.com 
Adding local repo with URL: http://127.0.0.1:8879/charts 
$HELM_HOME has been configured at /root/.helm.

Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.

Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.
To prevent this, run `helm init` with the --tiller-tls-verify flag.
For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation


[root@master linux-amd64]# kubectl get pods -n kube-system  |grep tiller
tiller-deploy-684c9f98f5-n6vwc   1/1     Running   0          8m

helm部署完毕

使用介绍

[root@master linux-amd64]# helm version				# 查看版本信息
Client: &version.Version{SemVer:"v2.15.2", GitCommit:"8dce272473e5f2a7bf58ce79bb5c3691db54c96b", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.15.2", GitCommit:"8dce272473e5f2a7bf58ce79bb5c3691db54c96b", GitTreeState:"clean"}


[root@master linux-amd64]# helm repo update			# 更新仓库信息
Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Successfully got an update from the "stable" chart repository
Update Complete.

ps: helm的官网地址
URL:  https://helm.sh/


官网helm的 仓库地址:https://hub.helm.sh/
可以在里面找一些可用的Charts列表,请自行打开浏览,资源都是拿来即用的。

在Search Charts里查找你所需要部署的服务

也可以命令行操作,(最好打开官网浏览一下再命令行操作一下,对比印象深)

[root@master linux-amd64]# helm search redis
NAME                            	CHART VERSION	APP VERSION	DESCRIPTION                                                 
stable/prometheus-redis-exporter	3.1.0        	1.0.4      	Prometheus exporter for Redis metrics                       
stable/redis                    	9.5.0        	5.0.5      	Open source, advanced key-value store. It is often referr...
stable/redis-ha                 	3.9.3        	5.0.5      	Highly available Kubernetes implementation of Redis         
stable/sensu                    	0.2.3        	0.28       	Sensu monitoring framework backed by the Redis transport   

[root@master linux-amd64]# helm inspect stable/redis
...可以查看部署帮助

具体想了解详细使用方法,最好去找个helm教程学习了解一下。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐