Kubernetes单master节点二进制部署

单Master节点二进制部署平台架构图

在这里插入图片描述

Master节点:

Master节点上面主要由四个模块组成,APIServer,schedule,controller-manager,etcd.

  • apiserver
    apiserver负责对外提供RESTful的kubernetes API的服务,它是系统管理指令的统一接口,任何对资源的增删该查都要交给apiserver处理后再交给Etcd,如图,kubectl(kubernetes提供的客户端工具,该工具内部是对kubernetes API的调用)是直接和apiserver交互的

  • scheduler
    scheduler负责调度Pod到合适的Node上,如果把scheduler看成一个黑匣子,那么它的输入是pod和由多个Node组成的列表,输出是Pod和一个Node的绑定。kubernetes目前提供了调度算法,同样也保留了接口。用户根据自己的需求定义自己的调度算法,

  • controller manager
    如果APIServer做的是前台的工作的话,那么controller manager就是负责后台的。每一个资源都对应一个控制器。而controller manager就是负责管理这些控制器的,比如我们通过apiserver创建了一个Pod,当这个Pod创建成功后,apiserver的任务就算完成了。

  • Etcd
    Etcd是一个高可用的键值存储系统,kubernetes使用它来存储各个资源的状态,从而实现了Restful的API。

Node节点:

每个Node节点主要由三个模板组成:kublet,kube-proxy,Docker-Engine

  • kube-proxy
    该模块实现了kubernetes中的服务发现和反向代理功能。kube-proxy支持TCP和UDP连接转发,默认基Round Robin算法将客户端流量转发到与service对应的一组后端pod。服务发现方面,kube-proxy使用etcd的watch机制监控集群中service和endpoint对象数据的动态变化,并且维护一个service到endpoint的映射关系,从而保证了后端pod的IP变化不会对访问者造成影响

  • kublet
    kublet是Master在每个Node节点上面的agent,是Node节点上面最重要的模块,它负责维护和管理该Node上的所有容器,但是如果容器不是通过kubernetes创建的,它并不会管理。本质上,它负责使Pod的运行状态与期望的状态一致

  • Docker-Engine
    容器引擎

部署master组件

(1)上传master脚本并解压

[root@localhost k8s]# unzip master.zip

(2)创建api-server证书目录

[root@localhost k8s]# mkdir k8s-cert

(3)创建证书生成脚本,并执行

[root@localhost k8s]# cd k8s-cert/
[root@localhost k8s-cert]# vim k8s-cert.sh 
cat > ca-config.json <<EOF
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "kubernetes": {
         "expiry": "87600h",
         "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ]
      }
    }
  }
}
EOF
cat > ca-csr.json <<EOF
{
    "CN": "kubernetes",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Beijing",
            "ST": "Beijing",
            "O": "k8s",
            "OU": "System"
        }
    ]
}
EOF
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
#-----------------------
cat > server-csr.json <<EOF
{
    "CN": "kubernetes",
    "hosts": [
      "10.0.0.1",
      "127.0.0.1",
      #下面为了方便后期添加使用多节点部署,添加了VIP、以及负载均衡的主从IP
      "192.168.49.209",         
      "192.168.49.179",         
      "192.168.49.99",          
      "192.168.49.104",         
      "192.168.49.105",  
      "kubernetes",
      "kubernetes.default",
      "kubernetes.default.svc",
      "kubernetes.default.svc.cluster",
      "kubernetes.default.svc.cluster.local"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "BeiJing",
            "ST": "BeiJing",
            "O": "k8s",
            "OU": "System"
        }
    ]
}
EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server
#-----------------------
cat > admin-csr.json <<EOF
{
  "CN": "admin",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "L": "BeiJing",
      "ST": "BeiJing",
      "O": "system:masters",
      "OU": "System"
    }
  ]
}
EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
#-----------------------
cat > kube-proxy-csr.json <<EOF
{
  "CN": "system:kube-proxy",
  "hosts": [],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "L": "BeiJing",
      "ST": "BeiJing",
      "O": "k8s",
      "OU": "System"
    }
  ]
}
EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy

#运行脚本
[root@localhost k8s-cert]# bash k8s-cert.sh
[root@localhost k8s-cert]# ls *.pem
admin-key.pem  ca-key.pem  kube-proxy-key.pem  server-key.pem
admin.pem      ca.pem      kube-proxy.pem      server.pem

(4)创建master上的k8s工作目录,将api-server证书复制到k8s工作目录中

[root@localhost k8s-cert]# mkdir /opt/kubernetes/{cfg,bin,ssl} -p
[root@localhost k8s-cert]# cp *.pem /opt/kubernetes/ssl/
[root@localhost k8s-cert]# ls /opt/kubernetes/ssl/
admin-key.pem  ca-key.pem  kube-proxy-key.pem  server-key.pem
admin.pem      ca.pem      kube-proxy.pem      server.pem

(5)上传kubernetes安装包到/root/k8s,并解压

[root@localhost k8s]# tar zxvf kubernetes-server-linux-amd64.tar.gz

(6)将解压的安装包内关键的命令文件复制到k8s工作目录

[root@localhost k8s]# cd /root/k8s/kubernetes/server/bin/
[root@localhost bin]# cp kube-apiserver kubectl kube-controller-manager kube-scheduler /opt/kubernetes/bin/

(7)创建管理用户角色

#先随机生成一个序列号
[root@localhost bin]# head -c 16 /dev/urandom | od -An -t x | tr -d ' '
357afbd4b6d23a5d28dc4bd4c344f001
#创建token.csv文件
[root@localhost bin]# vim /opt/kubernetes/cfg/token.csv
357afbd4b6d23a5d28dc4bd4c344f001,kubelet-bootstrap,10001,"system:kubelet-bootstrap"

(8)二进制文件,token,证书都准备好以后,开启apiserver
bash apiserver.sh 192.168.49.209 https://192.168.49.209:2379,https://192.168.49.129:2379,https://192.168.49.130:2379
#查看服务及端口是否开启
在这里插入图片描述
在这里插入图片描述

报错

如果端口开不起来请检查systemctl status kube-apiserver
在这里插入图片描述
不出意外是kube-apiserver 的配置文件出错
在这里插入图片描述
(9)启动scheduler服务

[root@localhost k8s]# ./scheduler.sh 127.0.0.1
Created symlink from /etc/systemd/system/multi-user.target.wants/kube-scheduler.service to /usr/lib/systemd/system/kube-scheduler.service.
#查看服务
[root@localhost k8s]# ps aux | grep kube

(10)启动controller-manager

[root@localhost k8s]# ./controller-manager.sh 127.0.0.1
Created symlink from /etc/systemd/system/multi-user.target.wants/kube-controller-manager.service to /usr/lib/systemd/system/kube-controller-manager.service.
#查看服务
[root@localhost k8s]# ps aux | grep kube

(11)查看master节点状态,显示的是ok或者true才算正常

cd /root/k8s/kubeconfig/server/bin
cp kubectl /opt/kubenetes/bin
[root@localhost k8s]# /opt/kubernetes/bin/kubectl get cs
NAME                 STATUS    MESSAGE             ERROR
scheduler            Healthy   ok                  
controller-manager   Healthy   ok                  
etcd-0               Healthy   {"health":"true"}   
etcd-1               Healthy   {"health":"true"}   
etcd-2               Healthy   {"health":"true"} 

安装node组件

(1)上传node脚本,并解压

[root@localhost ~]# unzip node.zip
Archive:  node.zip
  inflating: proxy.sh   	//安装启动proxy脚本             
  inflating: kubelet.sh		//安装启动kubelet脚本

(2)把master解压的k8s安装包内的文件kubelet、kube-proxy拷贝到node节点上去

scp kubelet.sh proxy.sh root@192.168.49.129:/opt/kubernetes/bin/
scp kubelet.sh proxy.sh root@192.168.49.130:/opt/kubernetes/bin/

(3)在master创建/root/k8s/kubeconfig工作目录,添加脚本,执行完成将文件复制到node节点上

  • kubeconfig是为访问集群所作的配置
[root@localhost k8s]# mkdir kubeconfig
[root@localhost k8s]# cd kubeconfig/
[root@localhost kubeconfig]# vim kubeconfig
APISERVER=$1
SSL_DIR=$2
# 创建kubelet bootstrapping kubeconfig 
export KUBE_APISERVER="https://$APISERVER:6443"
# 设置集群参数
kubectl config set-cluster kubernetes \
  --certificate-authority=$SSL_DIR/ca.pem \
  --embed-certs=true \
  --server=${KUBE_APISERVER} \
  --kubeconfig=bootstrap.kubeconfig
# 设置客户端认证参数
kubectl config set-credentials kubelet-bootstrap \
  --token=1bdc4a6c24ef718e8e8c64ded9d6021b \
  --kubeconfig=bootstrap.kubeconfig
# 设置上下文参数
kubectl config set-context default \
  --cluster=kubernetes \
  --user=kubelet-bootstrap \
  --kubeconfig=bootstrap.kubeconfig
# 设置默认上下文
kubectl config use-context default --kubeconfig=bootstrap.kubeconfig
#----------------------
# 创建kube-proxy kubeconfig文件
kubectl config set-cluster kubernetes \
  --certificate-authority=$SSL_DIR/ca.pem \
  --embed-certs=true \
  --server=${KUBE_APISERVER} \
  --kubeconfig=kube-proxy.kubeconfig
kubectl config set-credentials kube-proxy \
  --client-certificate=$SSL_DIR/kube-proxy.pem \
  --client-key=$SSL_DIR/kube-proxy-key.pem \
  --embed-certs=true \
  --kubeconfig=kube-proxy.kubeconfig
kubectl config set-context default \
  --cluster=kubernetes \
  --user=kube-proxy \
  --kubeconfig=kube-proxy.kubeconfig
kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig

#设置环境变量
[root@localhost kubeconfig]# vim /etc/profile
//在最后一行添加
export PATH=$PATH:/opt/kubernetes/bin/
[root@localhost kubeconfig]# source /etc/profile
#生成配置文件
[root@localhost kubeconfig]# bash kubeconfig 192.168.7.100 /root/k8s/k8s-cert/
[root@localhost kubeconfig]# ls
bootstrap.kubeconfig  kubeconfig  kube-proxy.kubeconfig
#拷贝配置文件到node节点
[root@localhost kubeconfig]# scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.7.102:/opt/kubernetes/cfg/
[root@localhost kubeconfig]# scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.7.103:/opt/kubernetes/cfg/
#创建bootstrap角色赋予权限用于连接apiserver请求签名
[root@localhost kubeconfig]# kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
clusterrolebinding.rbac.authorization.k8s.io/kubelet-bootstrap created

(4)在node01节点安装启动kubelet

#安装kubelet
[root@localhost ~]# bash kubelet.sh 192.168.49.129
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
#查看服务是否启动
[root@localhost ~]# ps aux | grep kubelet
[root@localhost ~]# systemctl status kubelet.service

(5)在master节点可以看到node1节点的证书请求

[root@localhost kubeconfig]# kubectl get csr

在这里插入图片描述

//Approved,Issued,已经被允许加入集群
#查看集群已经成功的加入node1节点
[root@localhost kubeconfig]# kubectl get node

在这里插入图片描述
(6)在node1节点,启动proxy服务

[root@node01 bin]# bash proxy.sh 192.168.49.129
Created symlink from /etc/systemd/system/multi-user.target.wants/kube-proxy.service to /usr/lib/systemd/system/kube-proxy.service.
[root@node01 bin]# systemctl status kube-proxy.service 

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值