部署Harbor仓库Https认证+单节点k8s集群部署(kubeadm)

---

  • 实验环境
    • 搭建了一台 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 服务器通信时能够验证服务器的身份,并且通信数据是加密的。

生成三个不同的证书是为了满足不同角色和通信路径的安全需求。通过这种方式,实验环境中的各个组件(master 节点、node 节点、Harbor 服务器)能够进行安全的身份验证和数据加密通信,确保整个系统的安全性和完整性。

  1. 自建 CA 证书(ca/ca.crt

    • 用途:作为根证书,用于签发其他证书。
    • 必要性:自建 CA 证书是信任链的根,通过它可以创建和签发受信任的服务器和客户端证书。在内部网络中,自建 CA 可以节省成本,并且提供灵活的证书管理。
  2. Harbor 服务器证书(server/harbor.ashm.com.crtserver/harbor.ashm.com.cert

    • 用途:用于 Harbor 服务器的 HTTPS 通信。
    • 必要性:服务器证书确保客户端(如 Docker 客户端)与 Harbor 服务器之间的通信是加密且安全的。服务器证书由自建 CA 签发,保证了证书的信任。
  3. 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 对公钥的签名。

参数详解:

  1. openssl req
    • 用于生成证书签名请求(CSR)或自签名证书。
  2. -x509
    • 生成一个自签名证书,而不是常规的 CSR 文件。自签名证书即 CA 证书。
  3. -new
    • 生成一个新的证书请求。
  4. -nodes
    • 不对私钥文件进行加密(不使用密码保护)。
  5. -sha512
    • 使用 SHA-512 哈希算法生成证书。SHA-512 提供更高的安全性。
  6. -days 3650
    • 指定证书的有效期为 3650 天(约 10 年)。
  7. -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)。
  8. -key ca/ca.key
    • 使用指定的私钥文件(ca/ca.key)来签名证书。该私钥文件必须先生成。
  9. -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
  1. -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/下面的东西。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐