部署Harbor仓库Https认证+单节点k8s集群部署(kubeadm)
本篇博客详细介绍了在部署Harbor时如何生成和使用多个证书,以确保系统的各部分之间安全通信和身份验证。具体包含自建CA证书、Harbor服务器证书和Docker客户端证书的生成和应用。同时,还详细讲解了K8S集群的部署过程,包括配置Docker源、安装K8S组件、初始化Master节点及添加Worker节点等步骤,确保读者可以顺利完成Harbor和K8S的配置及联调。
部署Harbor仓库Https认证+单节点k8s集群部署(kubeadm)
- 一、部署Harbor仓库https认证
- 二、K8S 集群部署
---
- 实验环境:
- 搭建了一台 master 节点,两个 node 节点,以及一个 Harbor 镜像仓库。
192.168.133.128 master.ashm.com
192.168.133.130 node1.ashm.com
192.168.133.131 node2.ashm.com
192.168.133.132 harbor.ashm.com
- 证书的生成和使用:
- 自建 CA 证书:
- 签发 Harbor 服务器证书,确保 Harbor 服务器在网络中的身份是可信的。
- Harbor 服务器证书:
- 配置在 Harbor 服务器上,启用 HTTPS 通信,保证从客户端到服务器的数据传输是加密的。
- Docker 客户端证书:
- 部署在 Docker 客户端(如 master 和 node 节点),确保这些客户端在与 Harbor 服务器通信时能够验证服务器的身份,并且通信数据是加密的。
- 自建 CA 证书:
生成三个不同的证书是为了满足不同角色和通信路径的安全需求。通过这种方式,实验环境中的各个组件(master 节点、node 节点、Harbor 服务器)能够进行安全的身份验证和数据加密通信,确保整个系统的安全性和完整性。
-
自建 CA 证书(
ca/ca.crt
):- 用途:作为根证书,用于签发其他证书。
- 必要性:自建 CA 证书是信任链的根,通过它可以创建和签发受信任的服务器和客户端证书。在内部网络中,自建 CA 可以节省成本,并且提供灵活的证书管理。
-
Harbor 服务器证书(
server/harbor.ashm.com.crt
和server/harbor.ashm.com.cert
):- 用途:用于 Harbor 服务器的 HTTPS 通信。
- 必要性:服务器证书确保客户端(如 Docker 客户端)与 Harbor 服务器之间的通信是加密且安全的。服务器证书由自建 CA 签发,保证了证书的信任。
-
Docker 客户端证书:
- 用途:用于 Docker 客户端与 Harbor 服务器之间的安全通信。
- 必要性:客户端证书确保 Docker 客户端可以安全地与 Harbor 服务器通信,避免中间人攻击和未授权的访问。客户端证书通常包括服务器证书和 CA 证书,确保客户端可以验证服务器的身份。
证书CSR 和 CRT 的区别(相关阅读)
在数字证书的生成和使用过程中,CSR(Certificate Signing Request)和 CRT(Certificate)是两个关键组件,它们有不同的用途和生成过程。下面是它们的详细区别:
1. CSR(Certificate Signing Request)
定义
- CSR 是证书签名请求。它包含了申请者的公钥以及相关的识别信息,如域名、组织名等。
主要用途
- 请求证书:CSR 是向证书颁发机构(CA)申请证书时所需提交的文件。它提供了 CA 所需的信息,以便签发证书。
生成过程
- 生成私钥:首先生成一对密钥(私钥和公钥)。
- 创建 CSR:使用私钥生成 CSR 文件,包含公钥和其它身份信息。
openssl req -new -key private.key -out request.csr
内容
- 公钥:包含申请者的公钥。
- 身份信息:如域名、组织名、单位名、城市、州/省和国家。
- 签名:用私钥签名,以确保请求的完整性和真实性。
2. CRT(Certificate)
定义
- CRT 是由 CA 签发的数字证书。它包含申请者的公钥以及 CA 对公钥的签名。
主要用途
- 验证身份:CRT 文件用于验证网站或服务器的身份,确保与之通信的客户端连接的是可信的实体。
- 加密通信:证书用于建立加密连接(如 HTTPS),确保数据传输的安全性。
生成过程
- 提交 CSR:将生成的 CSR 提交给 CA。
- CA 签发证书:CA 验证 CSR 并签发证书,生成 CRT 文件。
openssl x509 -req -in request.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out certificate.crt -days 365 -sha256
内容
- 公钥:申请者的公钥。
- 身份信息:如域名、组织名、单位名、城市、州/省和国家。
- 签名:由 CA 使用其私钥签名,证明其可信性。
- 有效期:证书的有效期限。
总结
- CSR 是用于申请证书的请求文件,包含申请者的公钥和身份信息。它由申请者生成并提交给 CA。
- CRT 是由 CA 签发的证书,包含公钥和 CA 的签名,用于验证身份和加密通信。它由 CA 根据 CSR 签发。
通过这些过程,CSR 和 CRT 在确保网络通信的安全性和可信性方面起到了重要作用。
一、部署Harbor仓库https认证
安装 Docker
1. 配置 Docker 源
curl -o /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
sed -i '
s+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
yum list docker-ce --showduplicates
2. yum安装指定的 Docker 版本
yum -y install docker-ce-23.0.1 docker-ce-cli-23.0.1
3. rpm安装(可选)
下载所属docker包
tar xf docker-ce-23_0_1.tar.gz
yum -y localinstalldocker-ce-23_0_1/*.rpm
4. 添加自动补全功能
yum -y install bash-completion
source /usr/share/bash-completion/bash_completion
5. 配置阿里云镜像加速
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://tuv7rqqq.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
6. 验证镜像加速是否成功
docker info | grep "Registry Mirrors" -A 1
7. 将 Docker 设置为开机自启动,禁用防火墙,禁用 SELinux
systemctl enable --now docker
systemctl disable --now firewalld
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
grep ^SELINUX= /etc/selinux/config
8. 配置 host 解析
cat >> /etc/hosts <<'EOF'
192.168.133.128 master.ashm.com
192.168.133.130 node1.ashm.com
192.168.133.131 node2.ashm.com
192.168.133.132 harbor.ashm.com
EOF
cat /etc/hosts
安装 Docker Compose
1. 添加 EPEL 源
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
2. 安装 Docker Compose
yum -y install docker-compose
3. 查看 Docker Compose 版本
docker-compose version
输出结果
docker-compose version 1.18.0, build 8dd22a9
docker-py version: 2.6.1
CPython version: 3.6.8
OpenSSL version: OpenSSL 1.0.2k-fips 26 Jan 2017
---
安装 Harbor
1. 下载 Harbor 软件包
Releases · goharbor/harbor (github.com)
2. 创建工作目录
mkdir -pv /ashm/softwares
3. 解压 Harbor 软件包
tar xvf harbor-offline-installer-v1.10.10.tgz -C /ashm/softwares/
4. 创建证书的工作目录
mkdir -pv /ashm/softwares/harbor/certs/{ca,server,client}
5. 生成自建 CA 证书
5.1 进入证书目录
cd /ashm/softwares/harbor/certs/
5.2 生成 CA 私钥
openssl genrsa -out ca/ca.key 4096
这条命令的作用是生成一个 4096 位的 RSA 私钥,并将其保存到 ca/ca.key
文件中。它不会生成公钥。生成私钥是所有加密操作的基础,私钥用于创建 CSR(证书签名请求)和签署其他证书。私钥包含生成公钥所需的所有信息,可以通过私钥派生出公钥,- 公钥可以通过私钥派生而来,但不是直接生成的。公钥用于加密,私钥用于解密和签名。
5.3 生成 CA 的自签名证书
openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=ashm.com" \
-key ca/ca.key \
-out ca/ca.crt
这条命令的作用:
使用 OpenSSL 生成一个自签名的 CA根证书。CA 证书包含公钥并可以用于签发其他证书,确保安全通信。
-key ca/ca.key
:使用前一步生成的私钥。- 在生成自签名证书的过程中,OpenSSL 自动从私钥中派生出公钥,并将其包含在生成的证书
ca/ca.crt
中。 - CRT 是由 CA 签发的数字证书。它包含申请者的公钥、一些组织域名等描述信息以及 CA 对公钥的签名。
参数详解:
openssl req
:- 用于生成证书签名请求(CSR)或自签名证书。
-x509
:- 生成一个自签名证书,而不是常规的 CSR 文件。自签名证书即 CA 证书。
-new
:- 生成一个新的证书请求。
-nodes
:- 不对私钥文件进行加密(不使用密码保护)。
-sha512
:- 使用 SHA-512 哈希算法生成证书。SHA-512 提供更高的安全性。
-days 3650
:- 指定证书的有效期为 3650 天(约 10 年)。
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=ashm.com"
:- 直接在命令行中指定证书的主题(subject)信息,避免交互式输入。该参数包括:
C=CN
:国家代码(中国)。ST=Beijing
:省/州(北京)。L=Beijing
:城市/地点(北京)。O=example
:组织名称(例如,example 公司)。OU=Personal
:组织单位(例如,Personal 部门)。CN=ashm.com
:公共名称(Common Name),通常是域名或服务名称(例如,ashm.com)。
- 直接在命令行中指定证书的主题(subject)信息,避免交互式输入。该参数包括:
-key ca/ca.key
:- 使用指定的私钥文件(
ca/ca.key
)来签名证书。该私钥文件必须先生成。
- 使用指定的私钥文件(
-out ca/ca.crt
:- 指定输出生成的自签名证书文件路径(
ca/ca.crt
)。
- 指定输出生成的自签名证书文件路径(
证书和公钥的关系:
- CA 证书:包含 CA 的公钥、公钥对应的私钥签名、证书的颁发者信息和有效期等。该公钥用于验证由该 CA 签发的证书。
- 私钥:与公钥配对使用,用于签名和解密。私钥应妥善保管,不应泄露。
6. 生成 Harbor 服务器的证书文件及客户端证书
6.1 生成 Harbor 主机的私钥
openssl genrsa -out server/harbor.ashm.com.key 4096
6.2 生成 Harbor 主机的证书申请
openssl req -sha512 -new \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.ashm.com" \
-key server/harbor.ashm.com.key \
-out server/harbor.ashm.com.csr
- CSR 是证书签名请求。它包含了申请者的公钥以及相关的识别信息,如域名、组织名等。CSR 是向证书颁发机构(CA)申请证书时所需提交的文件。它提供了 CA 所需的信息,以便CA签发证书。
- 用私钥生成CSR,公钥会自动生成包含在里面。
6.3 生成 x509 v3 扩展文件
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=ashm.com
DNS.2=ashm
DNS.3=harbor.ashm.com
EOF
- authorityKeyIdentifier=keyid,issuer:
- 这个扩展用于标识证书的颁发机构。
keyid
是密钥标识符,issuer
是颁发者信息,确保可以追踪到签发该证书的 CA。
- 这个扩展用于标识证书的颁发机构。
- basicConstraints=CA:FALSE:
- 指定证书的基本约束条件。
CA:FALSE
表示这个证书不是一个 CA 证书,而是一个终端实体证书(即用于服务器认证)。
- 指定证书的基本约束条件。
- keyUsage=digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment:
- 定义证书的关键用途。
digitalSignature
:允许证书用于数字签名。nonRepudiation
:防止签名者否认其签名行为。keyEncipherment
:允许加密密钥。dataEncipherment
:允许加密数据。
- 定义证书的关键用途。
- extendedKeyUsage=serverAuth:
- 扩展的关键用途,指定证书用于服务器认证(
serverAuth
)。
- 扩展的关键用途,指定证书用于服务器认证(
- subjectAltName=@alt_names:
- 指定证书的主题备用名称,这通常用于支持多域名或子域名。
@alt_names
表示将在文件中定义备用名称。
- 指定证书的主题备用名称,这通常用于支持多域名或子域名。
使用场景
- Web 服务器证书:
- 该扩展文件用于生成一个适用于 Web 服务器的证书,确保服务器可以通过 HTTPS 提供安全的通信。
- 多域名支持:
subjectAltName
扩展允许证书支持多个域名或子域名,这是现代 HTTPS 证书的常见要求。
6.4 使用 “v3.ext” 给 Harbor 主机签发证书
openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext \
-CA ca/ca.crt -CAkey ca/ca.key -CAcreateserial \
-in server/harbor.ashm.com.csr \
-out server/harbor.ashm.com.crt
-CA ca/ca.crt -CAkey ca/ca.key -CAcreateserial
:-CA ca/ca.crt
:指定 CA 的证书,用于签署新的证书。-CAkey ca/ca.key
:指定 CA 的私钥,用于签署新的证书。-CAcreateserial
:当你使用 OpenSSL 签发证书时,会使用-CAcreateserial
参数,这个参数会在指定路径创建一个.srl
文件(如果文件不存在),并在文件中存储一个初始的序列号。.srl
文件用于存储证书序列号(Serial Number)。序列号是证书中的一个重要字段,它必须是唯一的,以确保每个证书都可以唯一标识。序列号有助于证书的管理和追踪,例如在吊销某个证书时,可以通过序列号精确定位到该证书。-in server/harbor.ashm```markdown .com.csr
**:- 指定输入的 CSR 文件,包含待签署的公钥和相关信息。
-out server/harbor.ashm.com.crt
:- 指定输出的证书文件,即签署后的服务器证书。
6.5 将 crt 文件转换为 cert 客户端证书文件
openssl x509 -inform PEM -in server/harbor.ashm.com.crt -out server/harbor.ashm.com.cert
主要目的是将证书文件从 .crt
转换为 .cert
,docker不认crt格式证书。
6.6 准备 Docker 客户端证书
cp server/harbor.ashm.com.{cert,key} client/
cp ca/ca.crt client/
6.7 查看所有证书文件结果
ll -R
7. 配置 Harbor 服务器使用证书
7.1 切换工作目录
cd /ashm/softwares/harbor
7.2 修改配置文件
echo alias yy=\'egrep -v \"\^.*#\|\^\$\"\' >> /root/.bashrc
source /root/.bashrc
yy harbor.yml
这条命令将一个新别名 yy
添加到 .bashrc
文件中。该别名使用 egrep
命令过滤掉以 #
开头的注释行和空行。这种操作在管理服务器配置文件、脚本和日志时非常有用,可以帮助你更快速地找到重要的信息,而不被无关的注释和空白行干扰。
编辑 harbor.yml 文件,配置 HTTPS 证书和密钥:
hostname: harbor.ashm.com
https:
port: 443
certificate: /ashm/softwares/harbor/certs/server/harbor.ashm.com.crt
private_key: /ashm/softwares/harbor/certs/server/harbor.ashm.com.key
harbor_admin_password: 1
8. 安装 Harbor 服务
./install.sh
9. Windows 验证 Harbor 的 HTTPS
9.1 配置主机解析
在 C:\Windows\System32\drivers\etc\hosts
文件中,用管理员权限编辑添加以下内容:
192.168.133.128 master.ashm.com
192.168.133.130 node1.ashm.com
192.168.133.131 node2.ashm.com
192.168.133.132 harbor.ashm.com
9.2 浏览器访问
windows浏览器访问 https://harbor.ashm.com。
若是不行,检查是否开着VPN,或者试试有没有启动:
docker-compose up -d
10. Linux 验证 Harbor 的 HTTPS
10.1 在 Docker 客户端节点创建自签证书域名存放路径
mkdir -pv /etc/docker/certs.d/harbor.ashm.com
10.2 服务端将证书文件拷贝到客户端 Docker 节点
因为CA证书是自签的,docker login的时候会不认可。所以创建了这个同名目录,如果里面找得到CA证书,就会信任。
#可以这样拷贝,把服务私钥,证书和CA证书都拷贝过去
cp /ashm/softwares/harbor/certs/client/* /etc/docker/certs.d/harbor.ashm.com/
#也可以这样拷贝,只拷贝ca证书
cp /ashm/softwares/harbor/certs/client/ca.crt /etc/docker/certs.d/harbor.ashm.com/
10.3 登录验证
docker login -u admin -p 1 harbor.ashm.com
10.4 退出登录
登录时密码会明文存储在/root/.docker/config.json,为了安全要登出:
docker logout harbor.ashm.com
---
二、K8S 集群部署
K8S 环境准备
1. 所有节点(master,node1,node2)环境准备
1.1 关闭 swap 分区
基于配置文件关闭
swapoff -a && sysctl -w vm.swappiness=0
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab
1.2 确保各个节点 MAC 地址或 product_uuid 唯一
ifconfig eth0 | grep ether | awk '{print $2}'
cat /sys/class/dmi/id/product_uuid
1.3 检查网络节点是否互通
使用 ping
命令测试。
1.4 允许 iptables 检查桥接流量
使用iptables,让kube-proxy能够实现反向代理:
cat <<EOF | tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
1.5 检查端口是否被占用(可选)
参考:https://kubernetes.io/zh/docs/reference/ports-and-protocols/
1.6 检查 Docker 的环境(可选)
参考:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.15.md#unchanged
1.6.1 配置 Docker 源
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
sed -i '
s+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
yum list docker-ce --showduplicates
该命令使用sed
命令行工具来编辑文件内容。具体来说,这条命令的作用是将/etc/yum.repos.d/docker-ce.repo
文件中所有出现的download.docker.com
替换为mirrors.tuna.tsinghua.edu.cn/docker-ce
。
1.6.2 安装指定的 Docker 版本
yum -y install docker-ce-20.10.24 docker-ce-cli-20.10.24
yum -y install bash-completion
source /usr/share/bash-completion/bash_completion
1.6.3 配置 Docker 优化加速
mkdir -pv /etc/docker && cat <<EOF | tee /etc/docker/daemon.json
{
"registry-mirrors": ["https://tuv7rqqq.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
配置docker镜像加速,指定cgroup用systemd管理。
1.6.4 配置 host 解析
cat >> /etc/hosts <<'EOF'
192.168.133.128 master.ashm.com
192.168.133.130 node1.ashm.com
192.168.133.131 node2.ashm.com
192.168.133.132 harbor.ashm.com
EOF
cat /etc/hosts
1.6.5 将 Harbor 服务器的客户端证书拷贝到 K8S 集群
k8s所有节点创建自建证书目录:
mkdir -pv /etc/docker/certs.d/harbor.ashm.com
登录harbor服务器将自签的CA证书拷贝到k8s集群的所有节点:
scp /ashm/softwares/harbor/certs/client/ca.crt master.ashm.com:/etc/docker/certs.d/harbor.ashm.com
scp /ashm/softwares/harbor/certs/client/ca.crt node1.ashm.com:/etc/docker/certs.d/harbor.ashm.com
scp /ashm/softwares/harbor/certs/client/ca.crt node2.ashm.com:/etc/docker/certs.d/harbor.ashm.com
1.6.6 配置 Docker 开机自启动
systemctl enable --now docker
systemctl start docker
systemctl status docker
1.7 禁用防火墙
systemctl disable --now firewalld
1.8 禁用 SELinux
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
grep ^SELINUX= /etc/selinux/config
1.10 验证是否能够登录 Harbor 仓库
docker login -u admin -p 1 harbor.ashm.com
---
2. 所有节点安装 kubeadm, kubelet, kubectl
2.1 配置软件源
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
EOF
2.2 查看 kubeadm 的版本
yum -y list kubeadm --showduplicates | sort -r
2.3 安装 kubeadm, kubelet, kubectl 软件包
- Master 节点需要安装
kubeadm
,kubelet
,kubectl
。
yum -y install kubeadm-1.23.17-0 kubelet-1.23.17-0 kubectl-1.23.17-0
- Node 节点需要安装
kubeadm
,kubelet
。
yum -y install kubeadm-1.23.17-0 kubelet-1.23.17-0
Master 节点需要 kubelet 的原因
虽然 kubelet 在 Node 节点上主要用于调度和管理 Pod,但在 Master 节点上也需要安装和运行 kubelet,其原因如下:
- 管理控制平面组件:Master 节点上的控制平面组件(如 API Server、Controller Manager 和 Scheduler)也是以 Pod 形式运行的。kubelet 负责在 Master 节点上启动和管理这些 Pod。
- 确保一致性:在所有节点上运行 kubelet 可以确保集群的一致性和可靠性,提供统一的容器管理和监控。
在 Kubernetes 集群中,Node(工作节点)不需要安装 kubectl 的原因如下:
- 管理职责分离
kubectl 是 Kubernetes 的命令行工具,主要用于集群管理和操作。通常情况下,管理和操作集群的任务由管理员通过 Master 节点上的 kubectl 完成。在工作节点上安装 kubectl 没有必要,因为这些节点主要用于运行和管理容器,不进行集群管理操作。 - 安全性
在工作节点上安装 kubectl 可能会带来安全风险。工作节点上运行着各种应用程序和工作负载,如果 kubectl 工具被误用或滥用,可能会对集群的稳定性和安全性产生负面影响。
2.3.1 安装本地软件包(可选)
官网下载安装包
tar xf kubeadmin-rpm-1_23_17.tar.gz \
&& yum -y localinstall kubeadmin-rpm-1_23_17/*.rpm \
&& rm -rf kubeadmin-rpm-1_23_17*
2.4 启动 kubelet 服务
(若服务启动失败时正常现象,其会自动重启,因为缺失配置文件,初始化集群后恢复!此步骤可跳过!)
systemctl enable --now kubelet
systemctl start kubelet
systemctl status kubelet
---
初始化Master节点
1. 初始化 Master 节点
1.1 使用 kubeadm 初始化 master 节点
在初始化 Kubernetes Master 节点时,kubeadm init
会进行系统预检检查,下载控制平面组件镜像,生成并配置证书和密钥,启动 etcd 服务和控制平面组件(API Server、Controller Manager、Scheduler),配置集群网络和 DNS,初始化 kubeconfig 文件,并生成其他节点加入集群的命令。
- 每个 Pod 都有一个唯一的 IP 地址,这个 IP 地址从
--pod-network-cidr
指定的范围中分配。默认是10.244.0.0/16,这里自己指定了10.100.0.0/16的话,后面下载flannel网络要修改yml文件
kubeadm init \
--kubernetes-version=v1.23.17 \
--image-repository registry.aliyuncs.com/google_containers \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.200.0.0/16 \
--service-dns-domain=ashm.com
查看输出的信息,记录生成的 kubeadm join命令,尤其是token和 discovery-token-ca-cert-hash。后面node加入需要
如果失败,比如:
failed to pull image registry.aliyuncs.com/google_containers/kube-proxy:v1.23.17: output: Error response from daemon: Get "https://registry.aliyuncs.com/v2/": dial tcp: lookup registry.aliyuncs.com on 192.168.133.2:53: server misbehaving
, error: exit status 1
改下DNS
sudo bash -c 'echo "nameserver 8.8.8.8" > /etc/resolv.conf'
sudo bash -c 'echo "nameserver 8.8.4.4" >> /etc/resolv.conf'
测一下网络连接
curl -I https://registry.aliyuncs.com
ping registry.aliyuncs.com
参数说明
-
--kubernetes-version: 指定 K8S master 组件的版本号。
-
--image-repository: 指定下载 k8s master 组件的镜像仓库地址。
-
`–pod-network-cidr: 指定 Pod 的 IP 地址范围,用于集群中所有 Pod 的 IP 分配。
-
--service-cidr: 指定服务的 IP 地址范围,用于集群中所有服务的虚拟 IP 分配
-
--service-dns-domain: 指定 Kubernetes 集群中服务的默认 DNS 域名,这个域名并不需要与你的集群节点的实际域名(如 master.ashm.com、node1.ashm.com 等)直接相关,它是用于服务发现的内部 DNS 域名,默认为 cluster.local。
-
Pod 内的所有容器共享这个 Pod 的 IP 地址,并且可以通过
localhost
彼此通信。这是因为 Pod 内的容器是通过网络命名空间共享同一个网络栈。
3.2 拷贝授权文件,用于管理 K8S 集群
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
3.3 查看集群节点
kubectl get nodes
kubectl get componentstatuses
kubectl get cs
如下结果为成功
[root@localhost ~]# kubectl get componentstatuses
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy {"health":"true","reason":""}
---
2. 配置所有 Worker 节点加入 K8S 集群
2.1 所有节点加入 K8S 集群
kubeadm join <master的ip或者域名>:6443 \
--token <your_token> \
--discovery-token-ca-cert-hash sha256:<your_hash>
例如:
kubeadm join master.ashm.com:6443 \
--token dibf1d.wq50eig3bim6qdbt \
--discovery-token-ca-cert-hash sha256:b5d803846550f8959d83ef51f6602a8514f21e3aeee095ac3cd5983ee482b335
如果之前没记录token和hash,重新生成:
kubeadm token create
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
2.2 查看现有的节点
kubectl get nodes
---
2.3 添加 kubectl 的自动补全功能
echo "source <(kubectl completion bash)" >> ~/.bashrc && source ~/.bashrc
检查下node节点是否已经拉取并运行了pause和kube porxy镜像
docker images
如果空白,node节点查看一下日志
journalctl -u kubelet -f
如果报错是这个,
failed pulling image \"registry.aliyuncs.com/google_containers/pause:3.6\": Error response from daemon: Get \"https://registry.aliyuncs.com/v2/\": dial tcp: lookup registry.aliyuncs.com on 192.168.133.2:53: server misbehaving"
DNS有问题,node节点改一下
sudo bash -c 'echo "nameserver 8.8.8.8" > /etc/resolv.conf'
sudo bash -c 'echo "nameserver 8.8.4.4" >> /etc/resolv.conf'
3. 安装网络插件并验证连通性
`3.1 github下载安装flannel
flannel使得容器网络互通,在matser节点安装
官方地址
https://kubernetes.io/docs/concepts/cluster-administration/addons/
For Kubernetes v1.17+
Deploying Flannel with kubectl
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
3.2 本地安装 flannel
如果github上面那个执行不了,就下载安装包安装
wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
kubectl apply -f kube-flannel.yml
kubectl get nodes看一下
所有节点变成ready状态说明安装成功
3.3 检查 flannel 组件是否正常
kubectl get pods -A -o wide | grep kube-flannel
如果你之前改了flannel的默认cidr网段,这里会提示:CrashLoopBackOff
需要修改yml文件的"Network":为 “10.100.0.0/16”,然后kubectl delete -f kube-flannel.yml ,再次kubectl apply -f kube-flannel.yml
再次查看状态,running即可
至此全部安装完成,下面是创建pod测试
3.4 编写 DaemonSet 资源清单创建pod
vim linux85-ds.yaml
贴z这个进去
kind: DaemonSet
apiVersion: apps/v1
metadata:
name: linux85-ds
spec:
selector:
matchLabels:
school: ashm
class: linux85
template:
metadata:
labels:
school: ashm
class: linux85
spec:
containers:
- image: alpine
stdin: true
name: mylinux
3.5 创建 Pod 资源
kubectl apply -f linux85-ds.yaml
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
linux85-ds-ksbnt 1/1 Running 0 51s 10.100.2.4 node2.ashm.com <none> <none>
linux85-ds-l4d8c 1/1 Running 0 51s 10.100.1.2 node1.ashm.com <none> <none>
3.6 测试跨节点 Pod 之间的通信
查看pod里面容器的ip
kubectl exec linux85-ds-ksbnt -- ifconfig
eth0 Link encap:Ethernet HWaddr CA:04:12:6F:10:53
inet addr:10.100.2.4 Bcast:10.100.2.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1
RX packets:5 errors:0 dropped:0 overruns:0 frame:0
TX packets:1 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:446 (446.0 B) TX bytes:42 (42.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
node2的容器ping node1容器查看网络连通性
kubectl exec linux85-ds-ksbnt -- ping -c 3 10.100.1.2
3.7 删除 Pod 资源
kubectl delete -f linux85-ds.yaml
`4. 关机后服务重启清单
如果重启或者关机
node和master都设置了enable开机自启的话,一般都会自启动。
Harbor仓库需要开始服务
docker-compose up -d
docker-compose ps
查看是否所有服务都up,如果有不是up的,删除存储卷重来
docker-compose down -v -t 1
docker-compose up -d
如果想全部重置,删了/data/下面的东西。
更多推荐
所有评论(0)