本站所有文章均为原创,如对您有帮助,恳请帮忙点击任何一处广告

K8S教程(3)使用二进制方式部署K8S集群

发布:TangLu2020-8-6 15:54分类: Kubernetes 标签: docker k8s kubernetes

《K8S教程(2)使用kubeadm部署K8S集群》一文中介绍了如何使用kubeadm快速部署一套K8S用于学习。在生产环境中更多是使用二进制方式去安装K8S的各个组件,过程虽然繁琐,但是对于理解K8S是必须的。


一、各节点准备工作部分

# 每个节点关闭防火墙、selinux、swap
systemctl stop firewalld
systemctl disable firewalld
setenforce 0 
swapoff -a

# 每个节点配置hostname以及hosts解析
hostnamectl set-hostname k8s-master1
hostnamectl set-hostname k8s-node1
vi /etc/hosts
k8s-master1 192.168.10.101
k8s-master2 192.168.10.102
k8s-node1 192.168.10.103
k8s-node2 192.168.10.104


二、ETCD部分

1、部署一台cfssl节点,用于自建CA颁发自签证书

因为K8S各组件绝大部分是通过HTTPS通信,所以需要先准备好自签证书。这里推荐使用cfssl,比openssl配置简单。然后创建一个根证书,根证书是集群所有节点共享的,后续其它证书都由CA签名。


· 下载cfssl相关工具到合适的目录

wget http://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget http://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget http://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64

#赋予可执行权限并创建证书存放目录
chmod +x cfssl*
mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo
mv cfssljson_linux-amd64 /usr/bin/cfssljson
mv cfssl_linux-amd64 /usr/bin/cfssl

mkdir /data/cfssl

· 创建CA配置文件,用于配置根证书的使用场景(profile)和有效期等参数。这里配置了20年的有效期,相比kubeadm默认1年的有效期,这个足够长了

cat > /data/cfssl/ca-config.json << EOF
{
    "signing": {
        "default": {
            "expiry": "175200h"
        },
        "profiles": {
            "server": {
                "expiry": "175200h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "server auth"
                ]
            },
            "client": {
                "expiry": "175200h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "client auth"
                ]
            },
            "peer": {
                "expiry": "175200h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "server auth",
                    "client auth"
                ]
            }
        }
    }
}
EOF
#证书类型
#client certificate:客户端使用,用于服务端认证客户端,例如etcdctl、etcd proxy、fleetctl、docker客户端
#server certificate: 服务端使用,客户端以此验证服务端身份,例如docker服务端、kube-apiserver
#peer certificate: 双向证书,用于etcd集群成员间通信


· 创建CA证书签名请求文件,有申请过SSL证书的应该知道会向CA机构提交一个CSR文件,这里创建的签名请求文件就是这个CSR文件了

cat > /data/cfssl/ca-csr.json << EOF
{
    "CN": "ca",
    "hosts": [
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "ST": "sichuan",
            "L": "chengdu",
            "O": "linuxe",
            "OU": "ops"
        }
    ],
    "ca": {
        "expiry": "175200h"
    }
}
EOF
#CN: Common Name,浏览器使用该字段验证网站是否合法,一般写的是域名。浏览器使用该字段验证网站是否合法。
#C: Country, 国家
#ST: State,州,省
#L: Locality,地区,城市
#O: Organization Name,组织名称,公司名称
#OU: Organization Unit Name,组织单位名称,公司部门


· 使用CSR文件生成CA证书和私钥,这步完成后CA自身的证书签发环境就准备好了

cfssl gencert -initca /data/cfssl/ca-csr.json | cfssljson -bare ca - # -bare后面的ca就是指定了证书文件的名字,如ca.pem
ls /data/certs  #可以看到生成出来的ca.pem、ca.csr、ca-key.pem(CA私钥需妥善保管)


2、使用CFSSL生成ETCD证书

K8S依赖ETCD服务来存放数据,建议准备三台节点用作ETCD高可用部署,这样即使一个节点挂了也还在正常工作。这里用一台机器作为演示,如果有多台的话也是一样的配置方式


 · 为ETCD创建好证书签名请求文件

vi /data/cfssl/etcd-csr.json
{
    "CN": "etcd",
    "hosts": [
        "192.168.0.101",
        "192.168.0.102",
        "192.168.0.103"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "ST": "sichuan",
            "L": "chengdu",
            "O": "linuxe",
            "OU": "ops"
        }
    ]
}


· 使用CSR文件创建peer双向证书

cfssl gencert -ca=/data/cfssl/ca.pem -ca-key=/data/cfssl/ca-key.pem -config=/data/cfssl/ca-config.json -profile=peer /data/cfssl/etcd-csr.json | cfssljson -bare etcd


3、部署ETCD服务(v3.3.18)

· 通过https://github.com/etcd-io/etcd下载ETCD的二进制包并解压到指定目录,然后配置环境变量。本文所用ETCD版本为3.3.18,不同版本配置可能会有不同,请注意

tar zxf etcd-v3.3.18-linux-amd64.tar.gz -C /usr/local/etcd
source /etc/profile
etcd --version


· 为ETCD创建配置文件

mkdir /usr/local/etcd/{conf,data}  #注意data目录权限为700
chmod 700 /usr/local/etcd/data

vi /usr/local/etcd/conf/etcd.conf
ETCD_NAME=etcd1  #每个节点的名字
ETCD_DATA_DIR="/usr/local/etcd/data/"  #集群数据存放路径
ETCD_LISTEN_PEER_URLS="https://192.168.0.101:2380"  #ETCD集群内部通信端口,不对外提供服务,修改为每个节点的IP
ETCD_LISTEN_CLIENT_URLS="https://192.168.0.101:2379,https://127.0.0.1:2379"  ##ETCD集群和外部客户端通信端口
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.0.101:2379,https://127.0.0.1:2379"  #ETCD向外通告自己监听的端口
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.0.101:2380"  #ETCD向外通告自己监听的端口
ETCD_INITIAL_CLUSTER="etcd1=https://192.168.0.101:2380,etcd2=https://192.168.0.102:2380"   #所有ETCD节点名称和IP
ETCD_INITIAL_CLUSTER_STATE="new"  #是新集群还是需要加入集群
ETCD_INITIAL_CLUSTER_TOKEN="test"  #各节点通信时用到的认证token,自定义
#证书相关配置
ETCD_CERT_FILE="/data/cfssl/etcd.pem"
ETCD_KEY_FILE="/data/cfssl/etcd-key.pem"
ETCD_TRUSTED_CA_FILE="/data/cfssl/ca.pem"
ETCD_CLIENT_CERT_AUTH="true"
ETCD_PEER_CERT_FILE="/data/cfssl/etcd.pem"
ETCD_PEER_KEY_FILE="/data/cfssl/etcd-key.pem"
ETCD_PEER_TRUSTED_CA_FILE="/data/cfssl/ca.pem"
ETCD_PEER_CLIENT_CERT_AUTH="true"


· 为ETCD配置启动脚本,然后启动服务

vi /usr/lib/systemd/system/etcd.service
[Unit]
Description=etcd
After=network.target
[Service]
EnvironmentFile=-/usr/local/etcd/conf/etcd.conf
ExecStart=/usr/local/etcd/etcd
[Install]
WantedBy=multi-user.target


· 查看ETCD集群状态,如果发现有节点没有加入的话,看下message日志,通常需要清理data目录然后重启etcd

#http验证方法
etcdctl member list

#https验证方式
/usr/local/etcd/etcdctl --ca-file=/data/cfssl/ca.pem --cert-file=/data/cfssl/etcd.pem --key-file=/data/cfssl/etcd-key.pem --endpoints="https://192.168.0.101:2379" member list


k8s_etcd.jpg


三、K8S Master部署

1、为kube-apiserver创建证书

为K8S部署一个CA,然后颁发证书(这一步尝试使用之前的CA但一直过不去,不知道问题在哪里,新建一个CA就正常了

cat > /data/cfssl/k8s-ca-config.json << EOF
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "kubernetes": {
         "expiry": "87600h",
         "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ]
      }
    }
  }
}
EOF

cat > /data/cfssl/k8s-ca-csr.json << EOF 
{
    "CN": "kubernetes",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "sichuan",
            "ST": "chengdu",
            "O": "linuxe",
            "OU": "ops"
        }
    ]
}
EOF


· 用新建的CA为apiserver创建证书

cat > /data/cfssl/apiserver-csr.json << EOF
{
    "CN": "kubernetes",
    "hosts": [
      "192.168.0.101",
      "127.0.0.1",
      "kubernetes",
      "kubernetes.default",
      "kubernetes.default.svc",
      "kubernetes.default.svc.cluster",
      "kubernetes.default.svc.cluster.local"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "sichuan",
            "ST": "chengdu",
            "O": "linuxe",
            "OU": "ops"
        }
    ]
}
EOF


· 用K8S的CA为APISERVER颁发证书   

cfssl gencert -initca k8s-ca-csr.json | cfssljson -bare k8s-ca -
cfssl gencert -ca=k8s-ca.pem -ca-key=k8s-ca-key.pem -config=k8s-ca-config.json -profile=kubernetes apiserver-csr.json | cfssljson -bare apiserver


2、部署kube-apiserver(v1.18.6)

· 下载kube-apiserver二进制包,地址如下:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.18.md#server-binaries(注意下载的是Server binaries)。将下载好的包解压,运行kubectl version查看版本验证

tar zxf kubernetes-server-linux-amd64.tar.gz -C /usr/local/kubernetes
mkdir /usr/local/kubernetes/{conf,bin,logs}
cp /usr/local/kubernetes/server/bin/* /usr/local/kubernetes/bin/


· 创建一个K8S公共参数配置文件,这些公共配置所定义的变量会被其他组件调用

vi  /usr/local/kubernetes/conf/kubernetes.conf
KUBE_LOGTOSTDERR="--logtostderr=false"   #将日志输出到文件而不是屏幕上
KUBE_LOG_LEVEL="--v=2"  #日志级别
KUBE_LOG_DIR="--log-dir=/usr/local/kubernetes/logs/"  #日志路径
KUBE_MASTER="--master=127.0.0.1:8080"  #API-SERVER的地址


· 创建Kube-apiserver配置文件

vi /usr/local/kubernetes/conf/kube-apiserver.conf
KUBE_API_ADDRESS="--insecure-bind-address=127.0.0.1 --bind-address=0.0.0.0"  #apiserver监听地址
KUBE_API_PORT="--insecure-port=8080 --secure-port=6443"  #apiserver监听端口
KUBE_ETCD_SERVERS="--etcd-servers=https://192.168.0.101:2379,https://192.168.0.102:2379"  #ETCD地址
KUBE_ALLOW_PRIV="--allow-privileged=true"  #创建容器的时候是否用管理员权限
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,LimitRanger,SecurityContextDeny,ResourceQuota"  #控制器


· 生成token

head -c 16 /dev/urandom | od -An -t x | tr -d ' '  #生成token
cat /data/cfssl/token.csv  #将token写入到该文件
ab92cbc669d79d9fb856ba222c376443,kubelet-bootstrap,10001,"system:kubelet-bootstrap"


· 创建Kube-apiserver启动脚本,脚本里用到的变量值就是从配置文件中所读取的

cat > /usr/lib/systemd/system/kube-apiserver.service << EOF
[Unit]
Description=kube-apiserver
After=network.target
[Service]
EnvironmentFile=-/usr/local/kubernetes/conf/kubernetes.conf
EnvironmentFile=-/usr/local/kubernetes/conf/kube-apiserver.conf
ExecStart=/usr/local/kubernetes/bin/kube-apiserver \
            $KUBE_API_ADDRESS \
            $KUBE_API_PORT \
            $KUBE_ETCD_SERVERS \
            --etcd-cafile=/data/cfssl/ca.pem --etcd-certfile=/data/cfssl/etcd.pem --etcd-keyfile=/data/cfssl/etcd-key.pem \
            $KUBE_LOG_LEVEL \
            $KUBE_LOGTOSTDERR \
            $KUBE_LOG_DIR \
            $KUBE_ALLOW_PRIV \
            $KUBE_ADMISSION_CONTROL \
            --tls-cert-file=/data/cfssl/apiserver.pem --tls-private-key-file=/data/cfssl/apiserver-key.pem --client-ca-file=/data/cfssl/k8s-ca.pem --service-account-key-file=/data/cfssl/k8s-ca-key.pem --authorization-mode=RBAC,Node --enable-bootstrap-token-auth --token-auth-file=/data/cfssl/token.csv
[Install]
WantedBy=multi-user.target
EOF

#启动服务
systemctl start kube-apiserver


· 验证api-server服务是否正常

kubectl get cs


 apiserver.jpg


六、部署调度器kube-scheduler

cat >  /usr/lib/systemd/system/kube-scheduler.service << EOF
[Unit]
Description=kube-scheduler
After=network.target
[Service]
EnvironmentFile=-/usr/local/kubernetes/conf/kubernetes.conf
ExecStart=/usr/local/kubernetes/bin/kube-scheduler \
            $KUBE_MASTER \
            $KUBE_LOG_LEVEL \
            $KUBE_LOGTOSTDERR \
            $KUBE_LOG_DIR
[Install]
WantedBy=multi-user.target
EOF

#启动服务
systemctl start kube-scheduler


七、部署控制器kube-controller-manager

vi /usr/lib/systemd/system/kube-controller-manager.service
[Unit]
Description=kube-controller-manager
After=network.target
[Service]
EnvironmentFile=-/usr/local/kubernetes/conf/kubernetes.conf
ExecStart=/usr/local/kubernetes/bin/kube-controller-manager \
            $KUBE_MASTER \
            $KUBE_LOG_LEVEL \
            $KUBE_LOGTOSTDERR \
            $KUBE_LOG_DIR \
            --cluster-name=kubernetes --cluster-signing-cert-file=/data/cfssl/k8s-ca.pem --cluster-signing-key-file=/data/cfssl/k8s-ca-key.pem  --root-ca-file=/data/cfssl/ca.pem --service-account-private-key-file=/data/cfssl/k8s-ca-key.pem
[Install]
WantedBy=multi-user.target

#启动服务
systemctl start kube-controller-manager


检查Master各组件情况

/usr/local/kubernetes/bin/kubectl get cs


apiserver2.png



四、K8S Node部署

1、

温馨提示如有转载或引用以上内容之必要,敬请将本文链接作为出处标注,谢谢合作!
et_highlighter51
版权所有:《Linux运维技术学习站点
文章标题:《K8S教程(3)使用二进制方式部署K8S集群
除非注明,文章均为 《Linux运维技术学习站点》 原创
转载请注明本文短网址:http://www.linuxe.cn/post-509.html  [生成短网址]

已有 0/513 人参与

发表评论:

欢迎分享Linux运维技术学习站点

欢迎使用手机扫描访问本站,还可以关注微信哦~