单台虚拟机部署Kubernetes以及踩坑记录

这个东西全都是坑,为了简单,我选择了使用一台centos7来搭建,但是还是无数的坑,博客有很多也很杂,莫名就出现了各种奇妙的问题,就很玄学,然后自己整理了额一下我的步骤,中间也有摘自他人博客的内容。

接下来讲解安装详细步骤。

首先介绍一下搭建Kubernetes需要用到的东西:

       - etcd 一个高可用的K/V键值对存储和服务发现系统
  - flannel 实现夸主机的容器网络的通信
  - kube-apiserver 提供kubernetes集群的API调用
  - kube-controller-manager 确保集群服务
  - kube-scheduler 调度容器,分配到Node
  - kubelet 在Node节点上按照配置文件中定义的容器规格启动容器
  - kube-proxy 提供网络代理服务

k8s的集群需要五个角色,可以分别部署到五台主机上,也可以想部几台部几台。

master管理中心,管理所有的node,官方称之为minion
etcd数据库
registry私有库
node:至少两个节点,资源部署在node上。

本篇博客只是用了一台centos7虚拟机部署,所有内容均部署在这台机器上。

一、安装centos7虚拟机,此步忽略。

二、配置hosts文件实现相互解析(我们单台可以不配置),若配置的话,这样配置即可,IP+主机名:

vim /etc/hosts
192.168.1.166 k8s-master master
192.168.1.167 etcd
192.168.1.168 registry
192.168.1.169 k8s-node1
192.168.1.170 k8s-node2

三、部署master所需内容。

1)部署etcd数据库。etcd服务作为K8s集群的主数据库,在安装各服务之前需要首先安装和启动。安装etcd

# yum -y install etcd

2)修改 /etc/etcd/etcd.conf 配置文件

注:只修改下面未注释的三行
#[Member]
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379" 
ETCD_NAME="master"          
#[Clustering]
#用此路径访问etcd数据库
ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.1:2379"

3)启动etcd

# systemctl enable etcd && systemctl start etcd

4)测试etcd可用性

查看远程地址的两个端口是否好用,出现cluster is healthy
# etcdctl -C http://127.0.0.1:2379 cluster-health

5)安装docker

yum install docker -y

6)修改docker配置文件

vim /etc/sysconfig/docker      
//在if语句下面添加一行
OPTIONS='--insecure-registry registry:5000'   
docker访问默认使用443端口,不配置不能用。registry做过主机名解析

7)启动docker

systemctl enable docker
systemctl  start  docker

8)部署安装kubernetes

yum install kubernetes -y
注意:
在kubernetes master上需要运行以下组件,故分别配置组件启动相应服务:
    kubernetes API Server
    kubernetes Controller Manager
    kubernetes Scheduler

9)修改apiserver配置文件

vim /etc/kubernetes/apiserver

# The address on the local server to listen to. ——监听地址
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"          

# The port on the local server to listen on.——监听端口
KUBE_API_PORT="--port=8080"

# Comma separated list of nodes in the etcd cluster ——逗号分割的存在etcd数据库中的节点列表
KUBE_ETCD_SERVERS="--etcd-servers=http://0.0.0.0:2379"

# default admission control policies——k8s支持的所有控制器,删掉ServiceAccount和SecurityContextDeny
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,ResourceQuota"

10)修改config配置文件

vim /etc/kubernetes/config
# How the controller-manager, scheduler, and proxy find the apiserver
KUBE_MASTER="--master=http://127.0.0.1:8080"       控制器调度器联系apiserver组件的地址

11)启动apiserver、控制器、调度器

[wang@k8s ~]# systemctl enable kube-apiserver.service
[wang@k8s ~]# systemctl start kube-apiserver.service

[wang@k8s ~]# systemctl enable kube-controller-manager.service 
[wang@k8s ~]# systemctl start kube-controller-manager.service

[wang@k8s ~]# systemctl enable kube-scheduler.service 
[wang@k8s ~]# systemctl start kube-scheduler.service

12)部署node节点,因为我们master和node是同一台主机,所以下面关于node的重复步骤可以不做的,若多台主机的话,node节点按照以下配置。

node安装docker

yum install docker -y

13)修改docker配置文件

vim /etc/sysconfig/docker     
//在if语句后面添加一行
OPTIONS='--insecure-registry registry:5000'

14)启动node节点的docker

# systemctl enable docker
# systemctl start docker

15)安装kubernetes

yum install kubernetes -y

node节点需要两个组件:

    Kubelet
    kubernetes Proxy

16)修改node节点配置文件,单台主机的话,这个是不需要修改的,上边已经改过了

vim /etc/kubernetes/config
# How the controller-manager, scheduler, and proxy find the apiserver
# —— 连接apiserver的地址
KUBE_MASTER="--master=http://127.0.0.1:8080"      

17)修改kubelet配置文件

vim /etc/kubernetes/kubelet
# kubernetes kubelet (minion) config
# The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)
KUBELET_ADDRESS="--address=0.0.0.0"         kubelet监听地址

# You may leave this blank to use the actual hostname
KUBELET_HOSTNAME="--hostname-override=k8s"           #使用自己的主机名称

# location of the api-server
KUBELET_API_SERVER="--api-servers=http://127.0.0.1:8080"       

18)启动

[wang@k8s ~]# systemctl enable kubelet.service
[wang@k8s ~]# systemctl start kubelet.service
[wang@k8s ~]# systemctl enable kube-proxy.service
[wang@k8s ~]# systemctl start kube-proxy.service

19)查看节点状态:

kubectl -s http://127.0.0.1:8080 get node

应该是这样的:

20)部署flannel。凡是在k8s管理的节点下,都在一个大网络中,后面的所有资源在这个大子网中再创建小子网,但这些都无需手动配置,flannel自动完成。配置flannel的目的就是为了方便,不需要自己再配置路由。故在k8s中Flannel这个组件是非常重要的。下图是flannel原理图(有点模糊,凑合看,网上找的)。

21)集群中所有主机均需要安装配置flannel,我们只有一台主机,配置一台就行了

yum install flannel -y

22)配置flannel

vi /etc/sysconfig/flanneld
# etcd url location.  Point this to the server where etcd runs
#——配置连接etcd数据库
FLANNEL_ETCD_ENDPOINTS="http://127.0.0.1:2379"       

配置etcd中关于flannel的key
创建子网,子网需要以键值对的形式存到数据库中。
在配置文件中指定目录,默认会在这个目录中创建一个config的配置文件用来存放网络的配置
此步骤默认已经做好,无需再配置
# vi /etc/sysconfig/flanneld
    # For address range assignment
    FLANNEL_ETCD_PREFIX="/atomic.io/network"

23)配置 flannel 使用的 network,并将配置保存在 etcd 中(IP地址不用改):

# etcdctl mk /atomic.io/network/config '{ "Network": "172.17.0.0/16" }'     
    { "Network": "172.17.0.0/16" }

24)每个节点都启动flannel

systemctl restart flanneld

PS:从etcd中获取network 配置,并为本节点产生一个subnet保存在etcd中,并且产生 /run/flannel/subnet.env 文件配置文件内容入下(这个文件不用改):
 

FLANNEL_NETWORK=172.17.0.0/16  #全局的 falnnel network
FLANNEL_SUBNET=172.17.78.1/24   #本节点上分配到的小子网,此后所有容器就可以直接通讯,无需手动配置
FLANNEL_MTU=1400             #本节点上 flannel mtu
FLANNEL_IPMASQ=false

25)重启所有服务

//master节点
systemctl restart flanneld.service &&  systemctl restart docker &&  systemctl restart kube-apiserver.service &&  systemctl restart kube-controller-manager.service && systemctl restart kube-scheduler.service && systemctl restart etcd

如果使用了多台主机,在node节点重启(如果使用了单台主机只需要执行上面一条命令就行了,在执行一遍下面的命令也没啥问题):

systemctl restart flanneld.service &&  systemctl restart docker &&  systemctl restart kubelet.service &&  systemctl restart kube-proxy.service

26)部署dashboard,首先需要两个镜像,不翻墙也可以下载,就是比较慢。

docker pull daocloud.io/daocloud/google_containers_kubernetes-dashboard-amd64:v1.6.1      //国内即可下载

27)装载另一个镜像

docker pull docker.io/tianyebj/pod-infrastructure
docker save -o podinfrastructure.tar  docker.io/tianyebj/pod-infrastructure
docker load < podinfrastructure.tar

28)查看导入后的镜像

docker images
REPOSITORY                                               TAG          IMAGE ID            CREATED             SIZE
    daocloud.io/daocloud/google_containers_kubernetes-dashboard-amd64   v1.6.1              71dfe833ce74        10 months ago       134 MB
    docker.io/tianyebj/pod-infrastructure           latest       34d3450d733b    14 months ago   205 MB

29)所有node节点修改配置文件,单台主机的话,既是master也是node也要修改。

vim /etc/kubernetes/kubelet 

KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=docker.io/tianyebj/pod-infrastructure:latest"
//此处要与你的镜像名称保持一致!

30)重启服务

systemctl  restart kubelet

31)master节点任意目录创建yaml文件

 vim dashboard.yaml 
输入一下内容:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
# Keep the name in sync with image version and
# gce/coreos/kube-manifests/addons/dashboard counterparts
  name: kubernetes-dashboard-latest
  namespace: kube-system
spec:
  replicas: 1
  template:
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
        version: latest
        kubernetes.io/cluster-service: "true"
    spec:
      containers:
      - name: kubernetes-dashboard
        image: daocloud.io/daocloud/google_containers_kubernetes-dashboard-amd64:v1.6.1

        resources:
          # keep request = limit to keep this container in guaranteed class
          limits:
            cpu: 100m
            memory: 50Mi
          requests:
            cpu: 100m
            memory: 50Mi
        ports:
        - containerPort: 9090
        args:
         -  --apiserver-host=http://192.168.135.166:8080
        livenessProbe:
          httpGet:
            path: /
            port: 9090
          initialDelaySeconds: 30
          timeoutSeconds: 30

需要修改两个地方:

第一个箭头指向的地方需要和你的镜像名称保持一致,一定要一致,不知道名称,使用docker images命令进行查看。

第二个箭头指向的地方修改为自己虚拟机的IP地址,虚拟机自己网卡的ipv4地址

32)接着创建第二个yaml文件,照抄下面就行,不用修改

vim dashboardsvc.yaml
内容如下:
apiVersion: v1
kind: Service
metadata:
  name: kubernetes-dashboard
  namespace: kube-system
  labels:
    k8s-app: kubernetes-dashboard
    kubernetes.io/cluster-service: "true"
spec:
  selector:
    k8s-app: kubernetes-dashboard
  ports:
  - port: 80
    targetPort: 9090

33)master执行如下命令。

# kubectl create -f dashboard.yaml
# kubectl create -f dashboardsvc.yaml 

34)接下来验证是否成功。

kubectl get pod  -o wide  --all-namespaces
NAMESPACE     NAME                                           READY     STATUS    RESTARTS   AGE       IP            NODE
kube-system   kubernetes-dashboard-latest-1949991485-f3nmt   1/1       Running   0          33s       172.17.50.2   k8s

这个状态status一定要是running才算成功,

使用浏览器验证:

浏览器输入:http://192.168.48.128:8080/ui

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值