Kubernetes部署

主机规划

主机名 ssh地址 角色
master.kube.test ssh://root@172.23.107.18:60028 docker-ce、Harbor、etcdkeeper、kube-apiserver、kube-controller-manager、kube-scheduler、kubelet、kupe-proxy、flannel
node1.kube.test ssh://root@172.23.101.47:60028 docker-ce、etcd、kubelet、kupe-proxy、flannel
node2.kube.test ssh://root@172.23.101.48:60028 docker-ce、etcd、kubelet、kupe-proxy、flannel
node3.kube.test ssh://root@172.23.101.49:60028 docker-ce、etcd、kubelet、kupe-proxy、flannel

基础环境准备

基础配置
###############################################################
### 对所有主机的操作
###############################################################
systemctl stop firewalld
systemctl disable firewalld
vim /etc/selinux/config
###############################################################
SELINUX=disabled
###############################################################
setenforce 0
getenforce # 输出为Permissive或者Disabled则表示配置成功

# 修改内核参数
cat > /etc/sysctl.d/kubernetes.conf <<EOF
# 将桥接的IPv4流量传递到iptables的链
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
vm.swappiness=0
#关闭不使用的ipv6协议栈,防止触发docker BUG.
net.ipv6.conf.all.disable_ipv6=1
EOF
sysctl --system  # 使配置生效

# ntp时间同步
yum -y install ntp
systemctl daemon-reload
systemctl enable ntpd.service
systemctl start ntpd.service
配置yum源
###############################################################
### 对所有主机的操作
###############################################################
cd /etc/yum.repos.d/
# 首先配置docker-ce镜像
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 或者
wget https://download.docker.com/linux/centos/docker-ce.repo

# 更新本地yum缓存
yum clean all && yum makecache
# 验证配置
yum list | grep docker-ce
配置hosts以及免密
###############################################################
### 对所有主机的操作
###############################################################
echo "master.kube.test" >> /etc/hostname # 172.23.107.18上的操作
echo "node1.kube.test" >> /etc/hostname # 172.23.101.47上的操作
echo "node2.kube.test" >> /etc/hostname # 172.23.101.48上的操作
echo "node3.kube.test" >> /etc/hostname # 172.23.101.49上的操作
echo "HOSTNAME=master.kube.test" /etc/sysconfig/network # 172.23.107.18上的操作
echo "HOSTNAME=node1.kube.test" /etc/sysconfig/network # 172.23.101.47上的操作
echo "HOSTNAME=node2.kube.test" /etc/sysconfig/network # 172.23.101.48上的操作
echo "HOSTNAME=node3.kube.test" /etc/sysconfig/network # 172.23.101.49上的操作
hostname master.kube.test # 172.23.107.18上的操作
hostname node1.kube.test # 172.23.101.47上的操作
hostname node2.kube.test # 172.23.101.48上的操作
hostname node3.kube.test # 172.23.101.49上的操作

###############################################################
### ssh登陆到172.23.107.18主机
###############################################################
# 生成rsa密钥对
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
# 配置免密
ssh-copy-id -p 60028 172.23.107.18 # 在交互界面输入172.23.107.18主机的root账户密码
ssh-copy-id -p 60028 172.23.101.47 # 在交互界面输入172.23.101.47主机的root账户密码
ssh-copy-id -p 60028 172.23.101.48 # 在交互界面输入172.23.101.48主机的root账户密码
ssh-copy-id -p 60028 172.23.101.49 # 在交互界面输入172.23.101.49主机的root账户密码
# 配置本地域名映射
echo "master.kube.test    172.23.107.18" >> /etc/hosts
echo "node1.kube.test    172.23.101.47" >> /etc/hosts
echo "node2.kube.test    172.23.101.48" >> /etc/hosts
echo "node3.kube.test    172.23.101.49" >> /etc/hosts
# 远程拷贝hosts文件
scp -P 60028 /etc/hosts root@172.23.101.47:/etc/
scp -P 60028 /etc/hosts root@172.23.101.48:/etc/
scp -P 60028 /etc/hosts root@172.23.101.49:/etc/

安装docker

###############################################################
### 对所有主机的操作
###############################################################
mkdir -p /opt/{
   src,app,data/docker}
# 安装docker
yum install -y docker-ce
# 配置docker文件
vim /etc/docker/daemon.json
cat EOF > /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": ["https://registry.docker-cn.com"],  # 国内的docker镜像地址
  "insecure-registries": ["172.23.107.18:1080"],  # 允许push的局域网镜像仓库地址
  "exec-opts": ["native.cgroupdriver=systemd"],
  "graph": "/opt/data/docker"  # 镜像和容器存储地址
}
EOF
systemctl daemon-reload
systemctl start docker
systemctl enable docker

说明:

  • 使用systemd作为docker的cgroup driver可以确保服务器节点在资源紧张的情况更加稳定
  • 上面还可以自定义bip参数,设置docker网关和子网掩码,如:172.17.0.1/24。但是在后面配置了flannel是时候会在systemctl的unit配置中作为–bip参数传入,这里如果重复配置会导致docker不能启动
  • 部分参数(registry-mirrors、insecure-registries …)修改,只要reconfigure(systemctl reload docker) 就生效

Harbor安装

docker-compose安装

由于Harbor组件较多,一个个容器去配置比较麻烦,所以这里直接使用docker-compose统一安装

###############################################################
### ssh登录到172.23.107.18
###############################################################
wget https://github.com/docker/compose/releases/download/1.27.4/docker-compose-Linux-x86_64 -O /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
简介

  Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有Registry中, 确保数据和知识产权在公司内部网络中管控。另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。

各组件介绍
  • Proxy:Harbor的registry, UI, token等服务,通过一个前置的反向代理统一接收浏览器、Docker客户端的请求,并将请求转发给后端不同的服务。
  • Registry:负责储存Docker镜像,并处理docker push/pull 命令。由于我们要对用户进行访问控制,即不同用户对Docker image有不同的读写权限,Registry会指向一个token服务,强制用户的每次docker pull/push请求都要携带一个合法的token, Registry会通过公钥对token 进行解密验证。
  • Core services:这是Harbor的核心功能,主要提供以下服务:
    • UI:提供图形化界面,帮助用户管理registry上的镜像(image), 并对用户进行授权。
    • webhook:为了及时获取registry上image状态变化的情况,在Registry上配置webhook,把状态变化传递给UI模块。
    • token 服务:负责根据用户权限给每个docker push/pull命令签发token. Docker 客户端向Registry服务发起的请求,如果不包含token,会被重定向到这里,获得token后再重新向Registry进行请求。
  • Database:为core services提供数据库服务,负责储存用户权限、审计日志、Docker image分组信息等数据。
  • Job Services:提供镜像远程复制功能,可以把本地镜像同步到其他Harbor实例中。
  • Log collector:为了帮助监控Harbor运行,负责收集其他组件的log,供日后进行分析。
    在这里插入图片描述
安装
###############################################################
### ssh登录到172.23.107.18
###############################################################
mkdir /opt/data/harbor
wget https://github.com/goharbor/harbor/releases/download/v2.1.2/harbor-offline-installer-v2.1.2.tgz -P /opt/src/
tar -zxvf /opt/src/harbor-offline-installer-v2.1.2.tgz -C /opt/app/ && cd /opt/app/harbor
cp harbor.yml.tmpl harbor.yml
vim harbor.yml
hostname: 172.23.107.18
http:
  port: 80
# 将https相关配置注释
#https:
#  port: 443
#  certificate: /opt/data/harbor/cert/server.crt
#  private_key: /opt/data/harbor/cert/server.key
harbor_admin_password: Harbor123
data_volume: /opt/data/harbor
# 安装
./install.sh
docker-compose ps
# 启动
docker-compose up -d #启动
docker-compose stop #停止
docker-compose restart #重新启动
# 注:install之后会产生docker-compose的配置文件,可以在这里修改相关配置。或者在common里面还有nginx得相关配置可工修改。还可修改harbor.yml之后,再次执行install.sh
# 测试仓库
docker login 172.23.107.18:1080 --username admin --password Harbor12345
docker pull busybox
docker tag busybox:latest 172.23.107.18:1080/library/busybox:latest
docker push 172.23.107.18:1080/library/busybox:latest
docker rmi 172.23.107.18:1080/library/busybox:latest
docker rmi busybox:latest
docker pull 172.23.107.18:1080/library/busybox:latest

证书

环境准备
###############################################################
### ssh登录到172.23.107.18
###############################################################
mkdir -p /opt/app/cfssl-r1.2/{
   bin,ca}
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /opt/app/cfssl-r1.2/bin/cfssl
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O /opt/app/cfssl-r1.2/bin/cfssljson
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -O /opt/app/cfssl-r1.2/bin/cfssl-certinfo
ln -s /opt/app/cfssl-r1.2 /usr/local/cfssl && cd /usr/local/cfssl
chmod +x /usr/local/cfssl/bin/{
   cfssl,cfssljson,cfssl-certinfo}
vim /etc/profile
###############################################################
# System Env
export PATH=$PATH:/usr/local/cfssl/bin
###############################################################
source /etc/profile

# 编辑签发证书时的配置文件
cat > ca/ca-config.json <<EOF
{
    "signing": {
        "default": {
            "expiry": "175200h"
        },
        "profiles": {
            "etcd": {
                "expiry": "175200h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "server auth",
                    "client auth"
                ]
            },
            "kubernetes": {
                "expiry": "175200h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "server auth",
                    "client auth"
                ]
            }
        }
    }
}
EOF

说明:

  • ca-config.json:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile;
  • signing:表示该cert证书可以签名其他证书;生成的cert.pem证书中 CA=TRUE;
  • server auth:表示client可以用该cert证书对server提供的证书进行验证;
  • client auth:表示server可以用该cert证书对client提供的证书进行验证;
  • expiry:过期时间,这里设置的是20年;
自签名CA根证书
# 编辑证书请求文件
cat > ca/ca-csr.json <<EOF
{
    "CN": "kubernetes",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [{
      "C": "CN",
      "ST": "HuBei",
      "L": "WuHan",
      "O": "k8s",
      "OU": "System"
    }],
    "ca": {
        "expiry": "175200h"
    }
}
EOF

说明:

  • “CN”:Common Name,kube-apiserver 从证书中提取作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;
  • “O”:Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group)
# 生成证书
cfssl gencert -initca ca/ca-csr.json | cfssljson -bare /usr/local/cfssl/ca/ca

说明:结果会生成一个证书请求文件ca.csr、证书文件ca.pem和私钥文件ca-key.pemcfssljson应该是通过管道将cfssl生成的证书和私钥写入到以-bare定义的开头名称的文件中。

安装etcd服务

etcd安装
###############################################################
### ssh登录到172.23.101.47、172.23.101.48、172.23.101.49
###############################################################
wget https://github.com/etcd-io/etcd/releases/download/v3.4.13/etcd-v3.4.13-linux-amd64.tar.gz -P /opt/src
tar -zxvf /opt/src/etcd-v3.4.13-linux-amd64.tar.gz -C /opt/app/
ln -s /opt/app/etcd-v3.4.13-linux-amd64 /usr/local/etcd && cd /usr/local/etcd
mkdir -p /usr/local/etcd/{
   bin,conf} /opt/data/etcd/ca && mv /usr/local/etcd/{
   etcd,etcdctl} /usr/local/etcd/bin/
vim /etc/profile
#####################################################################
# Etcd Env
export ETCD_HOME=/usr/local/etcd
export PATH=$PATH:$ETCD_HOME/bin
#####################################################################
source /etc/profile
etcd -version
# 修改配置文件
cat > conf/etcd.conf <<EOF
# 规划三个节点etcd name分别为:etcd1、etcd2、etcd3
# [member]
ETCD_NAME=etcd1 # 对应的主机配置对应的name
ETCD_DATA_DIR="/opt/data/etcd" # 数据存储目录
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380" # 供集群间通信地址
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379" # 为客户端提供接口服务地址
# [cluster]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://[xxx.xxx.xxx.xxx]:2380" # 配置本机可供外部访问的集群通信地址
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" # 集群token
ETCD_ADVERTISE_CLIENT_URLS="http://[xxx.xxx.xxx.xxx]:2379" # 配置本机可供外部客户端访问的地址
ETCD_INITIAL_CLUSTER="etcd1=http://172.23.101.47:2380,etcd2=http://172.23.101.48:2380,etcd3=http://172.23.101.49:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_ENABLE_V2="true"
EOF

cat > /usr/lib/systemd/system/etcd.service <<EOF
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target

[Service]
Type=notify
WorkingDirectory=/opt/data/etcd
EnvironmentFile=-/usr/local/etcd/conf/etcd.conf
ExecStart=/usr/local/etcd/bin/etcd
Restart=on-failure
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable etcd.service
systemctl start etcd.service
# 验证
etcdctl member list
etcdctl --endpoints="http://172.23.101.47:2379,http://172.23.101.48:2379,http://172.23.101.49:2379" endpoint health

注意:

  • 启动集群启动时,一定要快速启动所有节点,否则 systemctl 命令会一直阻塞直到超时,只有集群所有节点都正常运行了,etcd集群才算是启动成功,systemctl才会有返回,systemctl status etcd.service才会是正常的
  • flannel操作etcd使用的是v2的API,而kubernetes操作etcd使用的v3的API,为了兼容flannel,将默认开启v2版本,故配置文件中设置 ETCD_ENABLE_V2=“true”
  • ETCD3.4版本ETCDCTL_API=3 etcdctl 和 etcd --enable-v2=false 成为了默认配置,如要使用v2版本,执行etcdctl时候需要设置ETCDCTL_API环境变量,例如:ETCDCTL_API=2 etcdctl
  • 可以使用api2 和 api3 写入 etcd3 数据,但是需要注意,使用不同的api版本写入数据需要使用相应的api版本读取数据。
    • f=2 etcdctl ls /
    • ETCDCTL_API=3 etcdctl get /
  • ETCD3.4版本会自动读取环境变量的参数,所以EnvironmentFile文件中有的参数,不需要再次在ExecStart启动参数中添加,二选一,如同时配置,会触发以下类似报错“etcd: conflicting environment variable “ETCD_NAME” is shadowed by corresponding command-line flag (either unset environment variable or disable flag)”
  • flannel操作etcd使用的是v2的API,而kubern
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值