---
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
生成三个不同的证书是为了满足不同角色和通信路径的安全需求。通过这种方式,实验环境中的各个组件(master 节点、node 节点、Harbor 服务器)能够进行安全的身份验证和数据加密通信,确保整个系统的安全性和完整性。
自建 CA 证书(ca/ca.crt
):
Harbor 服务器证书(server/harbor.ashm.com.crt
和 server/harbor.ashm.com.cert
):
Docker 客户端证书:
在数字证书的生成和使用过程中,CSR(Certificate Signing Request)和 CRT(Certificate)是两个关键组件,它们有不同的用途和生成过程。下面是它们的详细区别:
定义
主要用途
生成过程
openssl req -new -key private.key -out request.csr
内容
定义
主要用途
生成过程
openssl x509 -req -in request.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out certificate.crt -days 365 -sha256
内容
总结
通过这些过程,CSR 和 CRT 在确保网络通信的安全性和可信性方面起到了重要作用。
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
yum -y install docker-ce-23.0.1 docker-ce-cli-23.0.1
下载所属docker包
tar xf docker-ce-23_0_1.tar.gz
yum -y localinstalldocker-ce-23_0_1/*.rpm
yum -y install bash-completion
source /usr/share/bash-completion/bash_completion
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://tuv7rqqq.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
docker info | grep "Registry Mirrors" -A 1
systemctl enable --now docker
systemctl disable --now firewalld
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
grep ^SELINUX= /etc/selinux/config
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
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum -y install 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
---
Releases · goharbor/harbor (github.com)
mkdir -pv /ashm/softwares
tar xvf harbor-offline-installer-v1.10.10.tgz -C /ashm/softwares/
mkdir -pv /ashm/softwares/harbor/certs/{ca,server,client}
cd /ashm/softwares/harbor/certs/
openssl genrsa -out ca/ca.key 4096
这条命令的作用是生成一个 4096 位的 RSA 私钥,并将其保存到 ca/ca.key
文件中。它不会生成公钥。生成私钥是所有加密操作的基础,私钥用于创建 CSR(证书签名请求)和签署其他证书。私钥包含生成公钥所需的所有信息,可以通过私钥派生出公钥,- 公钥可以通过私钥派生而来,但不是直接生成的。公钥用于加密,私钥用于解密和签名。
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
:使用前一步生成的私钥。ca/ca.crt
中。参数详解:
openssl req
:
-x509
:
-new
:
-nodes
:
-sha512
:
-days 3650
:
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=ashm.com"
:
C=CN
:国家代码(中国)。ST=Beijing
:省/州(北京)。L=Beijing
:城市/地点(北京)。O=example
:组织名称(例如,example 公司)。OU=Personal
:组织单位(例如,Personal 部门)。CN=ashm.com
:公共名称(Common Name),通常是域名或服务名称(例如,ashm.com)。-key ca/ca.key
:
ca/ca.key
)来签名证书。该私钥文件必须先生成。-out ca/ca.crt
:
ca/ca.crt
)。证书和公钥的关系:
openssl genrsa -out server/harbor.ashm.com.key 4096
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
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
keyid
是密钥标识符,issuer
是颁发者信息,确保可以追踪到签发该证书的 CA。CA:FALSE
表示这个证书不是一个 CA 证书,而是一个终端实体证书(即用于服务器认证)。digitalSignature
:允许证书用于数字签名。nonRepudiation
:防止签名者否认其签名行为。keyEncipherment
:允许加密密钥。dataEncipherment
:允许加密数据。serverAuth
)。@alt_names
表示将在文件中定义备用名称。使用场景
subjectAltName
扩展允许证书支持多个域名或子域名,这是现代 HTTPS 证书的常见要求。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
**:-out server/harbor.ashm.com.crt
:openssl x509 -inform PEM -in server/harbor.ashm.com.crt -out server/harbor.ashm.com.cert
主要目的是将证书文件从 .crt
转换为 .cert
,docker不认crt格式证书。
cp server/harbor.ashm.com.{cert,key} client/
cp ca/ca.crt client/
ll -R
cd /ashm/softwares/harbor
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
./install.sh
在 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
windows浏览器访问 https://harbor.ashm.com。
若是不行,检查是否开着VPN,或者试试有没有启动:
docker-compose up -d
mkdir -pv /etc/docker/certs.d/harbor.ashm.com
因为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/
docker login -u admin -p 1 harbor.ashm.com
登录时密码会明文存储在/root/.docker/config.json,为了安全要登出:
docker logout harbor.ashm.com
---
基于配置文件关闭
swapoff -a && sysctl -w vm.swappiness=0
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab
ifconfig eth0 | grep ether | awk '{print $2}'
cat /sys/class/dmi/id/product_uuid
使用 ping
命令测试。
使用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
参考:https://kubernetes.io/zh/docs/reference/ports-and-protocols/
参考:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.15.md#unchanged
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
。
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
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管理。
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
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
systemctl enable --now docker
systemctl start docker
systemctl status docker
systemctl disable --now firewalld
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
grep ^SELINUX= /etc/selinux/config
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 软件包
kubeadm
, kubelet
, kubectl
。yum -y install kubeadm-1.23.17-0 kubelet-1.23.17-0 kubectl-1.23.17-0
kubeadm
, kubelet
。yum -y install kubeadm-1.23.17-0 kubelet-1.23.17-0
Master 节点需要 kubelet 的原因
虽然 kubelet 在 Node 节点上主要用于调度和管理 Pod,但在 Master 节点上也需要安装和运行 kubelet,其原因如下:
在 Kubernetes 集群中,Node(工作节点)不需要安装 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
---
1. 初始化 Master 节点
1.1 使用 kubeadm 初始化 master 节点
在初始化 Kubernetes Master 节点时,kubeadm init
会进行系统预检检查,下载控制平面组件镜像,生成并配置证书和密钥,启动 etcd 服务和控制平面组件(API Server、Controller Manager、Scheduler),配置集群网络和 DNS,初始化 kubeconfig 文件,并生成其他节点加入集群的命令。
--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. 安装网络插件并验证连通性
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
如果重启或者关机
node和master都设置了enable开机自启的话,一般都会自启动。
Harbor仓库需要开始服务
docker-compose up -d
docker-compose ps
查看是否所有服务都up,如果有不是up的,删除存储卷重来
docker-compose down -v -t 1
docker-compose up -d
如果想全部重置,删了/data/下面的东西。