在上一篇博文中,我们研究了如何在Cilium CNI的帮助下,在Azure的多个区域部署CockroachDB。在这篇博文中,我们发展了这个架构,允许使用Kubernetes pods和虚拟机的混合。因为CockroachDB是一个单一的二进制文件,所以它很容易被部署为容器,或者直接在虚拟机上运行。这种类型的架构可能是出于多种原因而需要的。当企业考虑他们未来的云战略以及如何将他们现有的应用工作负载转移到公共云上时,可能需要这种类型的混合架构。也许企业内部的数据中心不具备运行Kubernetes环境的能力,因为这可能很复杂,需要额外的基础设施,而这些基础设施可能无法使用。这只是一个例子,但可能会有很多。现在让我们仔细看看部署的细节。
Azure基础设施的部署
有些步骤看起来与我的上一篇博文相似,因为一些基础设施的元素是相同的,但为了完整起见,我还是把它们放在这里。首先,我们将设置一些变量,以使后续命令更容易。
export vm_type="Standard_DS2_v2"
export rg="bookham-k3s-multi-region"
export clus1="crdb-k3s-eastus"
export clus2="crdb-k3s-westus"
export clus3="crdb-k3s-northeurope"
export loc1="eastus"
export loc2="westus"
export loc3="northeurope"
export dnsname="private.cockroach.internal"
现在,我们已经设置了我们的变量,你可以根据你的需要进行调整。我们就可以用Azure CLI部署基础设施,以支持CockroachDB集群。首先,我们创建一个资源组来容纳我们将在Azure中创建的所有资源。
az group create --name $rg --location $loc1
网络分布在三个区域。在这三个区域中的每一个区域都创建了一个VNet,并创建了VNet Peers来连接它们。每个区域都必须有独特的、不重叠的地址空间。
这三条命令在三个区域中的每个区域都创建了一个VNet。
az network vnet create -g $rg -l $loc1 -n crdb-$loc1 --address-prefix 10.1.0.0/16 \
--subnet-name crdb-$loc1-sub1 --subnet-prefix 10.1.1.0/24
az network vnet create -g $rg -l $loc2 -n crdb-$loc2 --address-prefix 10.2.0.0/16 \
--subnet-name crdb-$loc2-sub1 --subnet-prefix 10.2.1.0/24
az network vnet create -g $rg -l $loc3 -n crdb-$loc3 --address-prefix 10.3.0.0/16 \
--subnet-name crdb-$loc3-sub1 --subnet-prefix 10.3.1.0/24
这个演示的关键因素之一是Azure中的私人托管DNS区。这使我们能够控制我们的豆荚和虚拟机的名称解析。如果我们不这样做,那么Kubernetes和虚拟机将使用不同的解决方案,这些解决方案的配置选项有限,无法整合在一起。Kubernetes使用CoreDNS作为Kubernetes内部的一个pod运行。这是为在一个特定的Kubernetes集群内运行的所有pod和服务进行名称解析。在Azure内部运行的虚拟机默认使用Azure提供的DNS服务。这对你快速启动和运行非常有用,但在这个解决方案中出现了一个问题。当你部署虚拟机时,它们被分配一个随机的DNS后缀。
ubuntu@mb-test-vm:~$ hostname -f
mb-test-vm.yn3ojvhzughuldx3eetkrprl4b.fx.internal.cloudapp.net
这种随机的DNS后缀使得CockroachDB的配置变得很棘手,尤其是在TLS证书方面,要以一致和自动化的方式进行。在上面的例子中,internal.cloudapp.net之前的两个元素是随机生成的。通过使用DNS私有区,我们能够控制这一点,并使用一个一致的名称,我们可以将其纳入CockroachDB的启动命令。因此,使用以下命令创建我们的DNS私有区。
az network private-dns zone create -g $rg \
-n $dnsname
az network private-dns link vnet create -g $rg -n $loc1-DNSLink \
-z $dnsname -v crdb-$loc1 -e true
az network private-dns link vnet create -g $rg -n $loc2-DNSLink \
-z $dnsname -v crdb-$loc2 -e true
az network private-dns link vnet create -g $rg -n $loc3-DNSLink \
-z $dnsname -v crdb-$loc3 -e true
这将创建DNS私有区,并将其连接到我们的三个VNets。
还有一些网络元素需要部署以支持我们的基础设施,即公共IP和虚拟机的网络适配器,网络安全组和允许访问资源的规则。
下面的命令创建了网络安全组和规则。
az network nsg create --resource-group $rg --location $loc1 --name crdb-$loc1-nsg
az network nsg create --resource-group $rg --location $loc2 --name crdb-$loc2-nsg
az network nsg create --resource-group $rg --location $loc3 --name crdb-$loc3-nsg
az network nsg rule create -g $rg --nsg-name crdb-$loc1-nsg -n NsgRuleSSH --priority 100 \
--source-address-prefixes '*' --source-port-ranges '*' \
--destination-address-prefixes '*' --destination-port-ranges 22 --access Allow \
--protocol Tcp --description "Allow SSH Access to all VMS."
az network nsg rule create -g $rg --nsg-name crdb-$loc2-nsg -n NsgRuleSSH --priority 100 \
--source-address-prefixes '*' --source-port-ranges '*' \
--destination-address-prefixes '*' --destination-port-ranges 22 --access Allow \
--protocol Tcp --description "Allow SSH Access to all VMS."
az network nsg rule create -g $rg --nsg-name crdb-$loc3-nsg -n NsgRuleSSH --priority 100 \
--source-address-prefixes '*' --source-port-ranges '*' \
--destination-address-prefixes '*' --destination-port-ranges 22 --access Allow \
--protocol Tcp --description "Allow SSH Access to all VMS."
az network nsg rule create -g $rg --nsg-name crdb-$loc1-nsg -n NsgRulek8sAPI --priority 200 \
--source-address-prefixes '*' --source-port-ranges '*' \
--destination-address-prefixes '*' --destination-port-ranges 6443 --access Allow \
--protocol Tcp --description "Allow Kubernetes API Access to all VMS."
az network nsg rule create -g $rg --nsg-name crdb-$loc2-nsg -n NsgRulek8sAPI --priority 200 \
--source-address-prefixes '*' --source-port-ranges '*' \
--destination-address-prefixes '*' --destination-port-ranges 6443 --access Allow \
--protocol Tcp --description "Allow Kubernetes API Access to all VMS."
az network nsg rule create -g $rg --nsg-name crdb-$loc3-nsg -n NsgRulek8sAPI --priority 200 \
--source-address-prefixes '*' --source-port-ranges '*' \
--destination-address-prefixes '*' --destination-port-ranges 6443 --access Allow \
--protocol Tcp --description "Allow Kubernetes API Access to all VMS."
az network nsg rule create -g $rg --nsg-name crdb-$loc1-nsg -n NsgRuleNodePorts --priority 300 \
--source-address-prefixes '*' --source-port-ranges '*' \
--destination-address-prefixes '*' --destination-port-ranges 30000-32767 --access Allow \
--protocol Tcp --description "Allow Kubernetes NodePort Access to all VMS."
az network nsg rule create -g $rg --nsg-name crdb-$loc2-nsg -n NsgRuleNodePorts --priority 300 \
--source-address-prefixes '*' --source-port-ranges '*' \
--destination-address-prefixes '*' --destination-port-ranges 30000-32767 --access Allow \
--protocol Tcp --description "Allow Kubernetes NodePort Access to all VMS."
az network nsg rule create -g $rg --nsg-name crdb-$loc3-nsg -n NsgRuleNodePorts --priority 300 \
--source-address-prefixes '*' --source-port-ranges '*' \
--destination-address-prefixes '*' --destination-port-ranges 30000-32767 --access Allow \
--protocol Tcp --description "Allow Kubernetes NodePort Access to all VMS."
接下来是公共IP和网络适配器。
az network public-ip create --resource-group $rg --location $loc1 --name crdb-$loc1-ip1 --sku standard
az network public-ip create --resource-group $rg --location $loc1 --name crdb-$loc1-ip2 --sku standard
az network public-ip create --resource-group $rg --location $loc1 --name crdb-$loc1-ip3 --sku standard
az network public-ip create --resource-group $rg --location $loc2 --name crdb-$loc2-ip1 --sku standard
az network public-ip create --resource-group $rg --location $loc2 --name crdb-$loc2-ip2 --sku standard
az network public-ip create --resource-group $rg --location $loc2 --name crdb-$loc2-ip3 --sku standard
az network public-ip create --resource-group $rg --location $loc3 --name crdb-$loc3-ip1 --sku standard
az network public-ip create --resource-group $rg --location $loc3 --name crdb-$loc3-ip2 --sku standard
az network public-ip create --resource-group $rg --location $loc3 --name crdb-$loc3-ip3 --sku standard
az network nic create --resource-group $rg -l $loc1 --name crdb-$loc1-nic1 --vnet-name crdb-$loc1 --subnet crdb-$loc1-sub1 --network-security-group crdb-$loc1-nsg --public-ip-address crdb-$loc1-ip1
az network nic create --resource-group $rg -l $loc1 --name crdb-$loc1-nic2 --vnet-name crdb-$loc1 --subnet crdb-$loc1-sub1 --network-security-group crdb-$loc1-nsg --public-ip-address crdb-$loc1-ip2
az network nic create --resource-group $rg -l $loc1 --name crdb-$loc1-nic3 --vnet-name crdb-$loc1 --subnet crdb-$loc1-sub1 --network-security-group crdb-$loc1-nsg --public-ip-address crdb-$loc1-ip3
az network nic create --resource-group $rg -l $loc2 --name crdb-$loc2-nic1 --vnet-name crdb-$loc2 --subnet crdb-$loc2-sub1 --network-security-group crdb-$loc2-nsg --public-ip-address crdb-$loc2-ip1
az network nic create --resource-group $rg -l $loc2 --name crdb-$loc2-nic2 --vnet-name crdb-$loc2 --subnet crdb-$loc2-sub1 --network-security-group crdb-$loc2-nsg --public-ip-address crdb-$loc2-ip2
az network nic create --resource-group $rg -l $loc2 --name crdb-$loc2-nic3 --vnet-name crdb-$loc2 --subnet crdb-$loc2-sub1 --network-security-group crdb-$loc2-nsg --public-ip-address crdb-$loc2-ip3
az network nic create --resource-group $rg -l $loc3 --name crdb-$loc3-nic1 --vnet-name crdb-$loc3 --subnet crdb-$loc3-sub1 --network-security-group crdb-$loc3-nsg --public-ip-address crdb-$loc3-ip1
az network nic create --resource-group $rg -l $loc3 --name crdb-$loc3-nic2 --vnet-name crdb-$loc3 --subnet crdb-$loc3-sub1 --network-security-group crdb-$loc3-nsg --public-ip-address crdb-$loc3-ip2
az network nic create --resource-group $rg -l $loc3 --name crdb-$loc3-nic3 --vnet-name crdb-$loc3 --subnet crdb-$loc3-sub1 --network-security-group crdb-$loc3-nsg --public-ip-address crdb-$loc3-ip3
基础设施设置的最后一步是使用Cloud init对每个虚拟机进行一些初始配置。这是必要的,以确保每个虚拟机都能利用DNS私有区的优势。这里有几个额外的设置,如安装curl和设置日志文件输出。这些对这个设置并不重要。
cat << EOF > cloud-init.txt
#cloud-config
package_upgrade: true
packages:
- curl
output: {all: '| tee -a /var/log/cloud-init-output.log'}
runcmd:
- set -e
- grep -v -G domain-name /etc/dhcp/dhclient.conf > dhclient.tmp
- echo "supersede domain-name \"$dnsname\";" >> dhclient.tmp
- echo "prepend domain-name-servers 168.63.129.16;" >> dhclient.tmp
- sudo cp /etc/dhcp/dhclient.conf /etc/dhcp/dhclient.conf.old
- sudo cp dhclient.tmp /etc/dhcp/dhclient.conf
- sudo dhclient -v
EOF
这个文件将在将虚拟机部署到每个区域时使用。
区域一中有三个虚拟机。
az vm create \
--resource-group $rg \
--location $loc1 \
--name crdb-$loc1-node1 \
--image UbuntuLTS \
--nics crdb-$loc1-nic1 \
--admin-username ubuntu \
--generate-ssh-keys \
--custom-data cloud-init.txt
az vm create \
--resource-group $rg \
--location $loc1 \
--name crdb-$loc1-node2 \
--image UbuntuLTS \
--nics crdb-$loc1-nic2 \
--admin-username ubuntu \
--generate-ssh-keys \
--custom-data cloud-init.txt
az vm create \
--resource-group $rg \
--location $loc1 \
--name crdb-$loc1-node3 \
--image UbuntuLTS \
--nics crdb-$loc1-nic3 \
--admin-username ubuntu \
--generate-ssh-keys \
--custom-data cloud-init.txt
区域二中有三个虚拟机。
az vm create \
--resource-group $rg \
--location $loc2 \
--name crdb-$loc2-node1 \
--image UbuntuLTS \
--nics crdb-$loc2-nic1 \
--admin-username ubuntu \
--generate-ssh-keys \
--custom-data cloud-init.txt
az vm create \
--resource-group $rg \
--location $loc2 \
--name crdb-$loc2-node2 \
--image UbuntuLTS \
--nics crdb-$loc2-nic2 \
--admin-username ubuntu \
--generate-ssh-keys \
--custom-data cloud-init.txt
az vm create \
--resource-group $rg \
--location $loc2 \
--name crdb-$loc2-node3 \
--image UbuntuLTS \
--nics crdb-$loc2-nic3 \
--admin-username ubuntu \
--generate-ssh-keys \
--custom-data cloud-init.txt
最后,在最后一个区域有三个。
az vm create \
--resource-group $rg \
--location $loc3 \
--name crdb-$loc3-node1 \
--image UbuntuLTS \
--nics crdb-$loc3-nic1 \
--admin-username ubuntu \
--generate-ssh-keys \
--custom-data cloud-init.txt
az vm create \
--resource-group $rg \
--location $loc3 \
--name crdb-$loc3-node2 \
--image UbuntuLTS \
--nics crdb-$loc3-nic2 \
--admin-username ubuntu \
--generate-ssh-keys \
--custom-data cloud-init.txt
az vm create \
--resource-group $rg \
--location $loc3 \
--name crdb-$loc3-node3 \
--image UbuntuLTS \
--nics crdb-$loc3-nic3 \
--admin-username ubuntu \
--generate-ssh-keys \
--custom-data cloud-init.txt
这就是所有基础设施组件的完成。
K3s Kubernetes的部署
第一步是安装一个K3s领导节点。要做到这一点,我们将使用k3sup(称为 "番茄酱")。k3sup是一个轻量级的工具,可以在任何本地或远程虚拟机上使用k3s从零到KUBECONFIG。你只需要ssh访问和k3sup二进制文件就可以立即获得kubectl访问权。
第一步是在你要用来配置演示环境的主机工作站上安装k3sup。这可以是你的工作站,也可以是一个专门的构建器机器。
curl -sLS https://get.k3sup.dev | sh
sudo install k3sup /usr/local/bin/
k3sup --help
接下来我们需要把k3s部署到第一区域的第一个虚拟机上。使用下面的k3sup命令来安装第一个节点。请确保用节点的公共IP替换(公共IP)。检索区域一中的第一个节点的公共IP地址
LEADERR1=$(az vm show -d -g $rg -n crdb-$loc1-node1 --query publicIps -o tsv)
现在使用k3sup来创建第一个Kubernetes集群。
k3sup install \
--ip=$LEADERR1 \
--user=ubuntu \
--sudo \
--cluster \
--k3s-channel stable \
--merge \
--local-path $HOME/.kube/config \
--context=$clus1
接下来你可以把代理节点添加到k3s中,这将是我们工作负载运行的地方。在这个例子中,我们将添加三个代理。获取第二个节点的公共IP地址。
AGENT1R1=$(az vm show -d -g $rg -n crdb-$loc1-node2 --query publicIps -o tsv)
现在使用k3sup将该节点添加到现有集群中。
k3sup join \
--ip $AGENT1R1 \
--user ubuntu \
--sudo \
--k3s-channel stable \
--server \
--server-ip $LEADERR1 \
--server-user ubuntu \
--sudo
对第三个节点重复这个步骤。
获取第三个节点的公共IP地址。
AGENT2R1=$(az vm show -d -g $rg -n crdb-$loc1-node3 --query publicIps -o tsv)
现在使用k3sup将该节点添加到现有集群中。
k3sup join \
--ip $AGENT2R1 \
--user ubuntu \
--sudo \
--k3s-channel stable \
--server \
--server-ip $LEADERR1 \
--server-user ubuntu \
--sudo
对第二个区域采取同样的步骤。
LEADERR2=$(az vm show -d -g $rg -n crdb-$loc2-node1 --query publicIps -o tsv)
现在使用k3sup来创建第二个Kubernetes集群。
k3sup install \
--ip=$LEADERR2 \
--user=ubuntu \
--sudo \
--cluster \
--k3s-channel=stable \
--merge \
--local-path $HOME/.kube/config \
--context=$clus2
接下来你可以把代理节点添加到k3s中,这将是我们工作负载运行的地方。在这个例子中,我们将添加两个代理。获取第二个节点的公共IP地址。
AGENT1R2=$(az vm show -d -g $rg -n crdb-$loc2-node2 --query publicIps -o tsv)
现在使用k3sup将该节点添加到现有集群中。
k3sup join \
--ip $AGENT1R2 \
--user ubuntu \
--sudo \
--k3s-channel stable \
--server \
--server-ip $LEADERR2 \
--server-user ubuntu \
--sudo
对第三个节点重复这个步骤。
获取第三个节点的公共IP地址。
AGENT2R2=$(az vm show -d -g $rg -n crdb-$loc2-node3 --query publicIps -o tsv)
现在使用k3sup将该节点添加到现有集群中。
k3sup join \
--ip $AGENT2R2 \
--user ubuntu \
--sudo \
--k3s-channel stable \
--server \
--server-ip $LEADERR2 \
--server-user ubuntu \
--sudo
现在Kubernetes已经部署到两个区域,我们可以将CockroachDB部署到这两个集群中。
CockroachDB Kubernetes的部署
现在我们已经在两个地区部署了所需的基础设施,这两个地区都是基于Kubernetes的k3s分布,我们就可以部署CockroachDB了。首先解决这两个区域的原因是,虚拟机的部署方法会有很大不同。
为了部署CockroachDB,我利用了这里提供的一个Python脚本,该脚本将CockroachDB部署到GKE。我不得不对这个脚本和Kubernetes清单模板进行调整和修改,使其适用于这个用例。第一个改动是在StatefulSet模板的pod spec部分下增加了两行。
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
这允许这个StatefulSet中的pod使用它所运行的节点的主机网络。这是必要的,这样在Kubernetes内部运行的pod就可以路由到不在Kubernetes内部的虚拟机上的CockroachDB节点。对于使用hostNetwork运行的Pod,你应该如上所述明确设置其DNS策略。另外,在这个演示中,我把存储要求从100GB调整到了10GB,所以可以考虑改变这个要求,以满足你的要求。
现在我们可以仔细看看Python脚本了。改变目录进入多区域文件夹。
cd multiregion
检索你的集群的kubectl "contexts"。
kubectl config get-contexts
在setup.py脚本的顶部,在contexts地图中填写你的集群的区域和它们的 "上下文 "名称,这已经在本演示中提供的文件中完成了,但是是针对开始时设定的区域。
contexts = {
'eastus': 'crdb-k3s-eastus',
'westus': 'crdb-k3s-westus',
}
在setup.py脚本中,在区域图中填入你的集群的区域和相应的区域,比如说。
regions = {
'eastus': 'eastus',
'westus': 'westus',
}
设置区域是可选的,但推荐使用,因为如果你在同一区域使用多个区域,它可以提高CockroachDB的数据放置多样化的能力。如果你不指定区域,就把地图留空。现在运行脚本!
运行setup.py 脚本。
python setup.py
在这个演示中,我使用eastus 和westus 作为我的Kubernetes区域,northeurope 作为我的虚拟机区域。如果你使用同样的方法,那么你将能够使用下面的两个配置图。如果你使用其他区域和IP地址,那么你可以使用它们作为例子,但你需要编辑内容以反映你使用的区域。下面是一个片段,显示了你需要修改的地方。
westus.svc.cluster.local:53 { # <---- Modify
log
errors
ready
cache 10
forward . 10.2.1.4 10.2.1.5 10.2.1.6 { # <---- Modify
}
}
private.cockroach.internal:53 { # <---- Modify
log
errors
ready
cache 10
forward . 168.63.129.16:53 { # <---- Modify
}
}
然后应用新的ConfigMaps。
kubectl replace -f eastus.yaml --context crdb-k3s-eastus --force
kubectl replace -f westus.yaml --context crdb-k3s-westus --force
确认每个集群中的CockroachDB pods在READY 列中显示1/1 - 这可能需要几分钟时间来传播,表明它们已经成功加入集群。
kubectl get pods --selector app=cockroachdb --all-namespaces --context $clus1
kubectl get pods --selector app=cockroachdb --all-namespaces --context $clus2
在这一点上,CockroachDB将在两个地区启动和运行。为了在后面的演示中访问管理控制台,需要在CockroachDB中创建一个具有管理权限的用户。要做到这一点,可以在Kubernetes集群中部署一个安全客户端。
kubectl create -f client-secure.yaml --namespace $loc1
现在,pod已经被创建,我们可以执行容器,这样我们就可以运行我们的命令。
kubectl exec -it cockroachdb-client-secure -n $loc1 -- ./cockroach sql --certs-dir=/cockroach-certs --host=cockroachdb-public
创建一个用户并使之成为管理员。
CREATE USER WITH PASSWORD 'cockroach';
GRANT admin TO ;
\q;
最后,我们需要添加第三个也是最后一个区域。
虚拟机的部署
下面的步骤需要在你希望添加到集群的每个节点上完成。
- SSH到节点和所需的文件夹结构。
LOC3NODE1=$(az vm show -d -g $rg -n crdb-$loc3-node1 --query publicIps -o tsv)
ssh ubuntu@$LOC3NODE1
- 现在创建所需的文件夹结构。
mkdir cockroach
cd cockroach
mkdir certs
mkdir my-safe-directory
exit
- 现在我们需要把一些文件转移到每个节点上。这将是将节点加入到集群中所需要的证书。我们还将转移一个shell脚本,它将在每个节点上启动Cockroach。请确保你目前是在 repo 的根目录下进行下一组命令。
scp startdb.sh ubuntu@$LOC3NODE1:/home/ubuntu/cockroach
cd multiregion/certs
scp ca.crt client.root.crt client.root.key ubuntu@$LOC3NODE1:/home/ubuntu/cockroach/certs
cd ../my-safe-directory
scp ca.key ubuntu@$LOC3NODE1:/home/ubuntu/cockroach/my-safe-directory
- 现在所有的文件都被复制到了节点上,我们可以通过SSH进入并安装和运行Cockroachdb。首先我们下载二进制文件,解压并复制到我们的路径。
ssh ubuntu@$LOC3NODE1
curl https://binaries.cockroachdb.com/cockroach-v21.2.3.linux-amd64.tgz | tar -xz && sudo cp -i cockroach-v21.2.3.linux-amd64/cockroach /usr/local/bin/
cockroach --version
cd cockroach
chmod 766 startdb.sh
cd certs
chmod 700 *
cd ..
./startdb.sh
- 在另外两个节点上重复这些步骤...
LOC3NODE2=$(az vm show -d -g $rg -n crdb-$loc3-node2 --query publicIps -o tsv)
ssh ubuntu@$LOC3NODE2
- 创建所需的文件夹结构。
mkdir cockroach
cd cockroach
mkdir certs
mkdir my-safe-directory
exit
- 像我们在第一个节点上做的那样,把文件传输过去。再次,确保你是在 repo 的根目录下。
scp startdb.sh ubuntu@$LOC3NODE2:/home/ubuntu/cockroach
cd multiregion/certs
scp ca.crt client.root.crt client.root.key ubuntu@$LOC3NODE2:/home/ubuntu/cockroach/certs
cd ../my-safe-directory
scp ca.key ubuntu@$LOC3NODE2:/home/ubuntu/cockroach/my-safe-directory
- 现在所有的文件都被复制到节点上了,我们可以通过SSH进入并安装和运行Cockroachdb。首先我们下载二进制文件,解压并复制到我们的路径。
ssh ubuntu@$LOC3NODE2
curl https://binaries.cockroachdb.com/cockroach-v21.2.3.linux-amd64.tgz | tar -xz && sudo cp -i cockroach-v21.2.3.linux-amd64/cockroach /usr/local/bin/
cockroach --version
cd cockroach
chmod 766 startdb.sh
cd certs
chmod 700 *
cd ../my-safe-directory
chmod 700 *
cd ..
./startdb.sh
- 现在将CockroachDB部署到节点3....。
LOC3NODE3=$(az vm show -d -g $rg -n crdb-$loc3-node3 --query publicIps -o tsv)
ssh ubuntu@$LOC3NODE3
- 最后一次创建所需的文件结构。
mkdir cockroach
cd cockroach
mkdir certs
mkdir my-safe-directory
exit
- 像我们在其他节点上做的那样,把文件传输过去。确保你是在 repo的根目录下。
scp startdb.sh ubuntu@$LOC3NODE3:/home/ubuntu/cockroach
cd multiregion/certs
scp ca.crt client.root.crt client.root.key ubuntu@$LOC3NODE3:/home/ubuntu/cockroach/certs
cd ../my-safe-directory
scp ca.key ubuntu@$LOC3NODE3:/home/ubuntu/cockroach/my-safe-directory
- 现在所有的文件都被复制到了节点上,我们可以通过SSH进入并安装和运行Cockroachdb。首先我们下载二进制文件,解压并复制到我们的路径。
ssh ubuntu@$LOC3NODE3
curl https://binaries.cockroachdb.com/cockroach-v21.2.3.linux-amd64.tgz | tar -xz && sudo cp -i cockroach-v21.2.3.linux-amd64/cockroach /usr/local/bin/
cockroach --version
cd cockroach
chmod 766 startdb.sh
cd certs
chmod 700 *
cd ../my-safe-directory
chmod 700 *
cd ..
./startdb.sh
- 现在我们应该有三个地区的所有九个节点可用。我们可以通过使用kubectl来转发流量,轻松访问Cockroach管理界面。
kubectl port-forward cockroachdb-0 8080 --context $clus1 --namespace $loc1
- 然后你就可以通过你的浏览器访问管理界面。http://localhost:8080
在UI中,你应该看到所有的九个节点,六个来自Kubernetes,三个来自虚拟机。
CockroachDB部署模式的思考
在某些情况下,可能需要为你的CockroachDB集群混合不同的部署模式。正如你在这个演示中看到的那样,可以混合Kubernetes Pods和虚拟机。这是通过主机网络暴露Kubernetes Pods来实现的。通常情况下,我不推荐这种方法,因为它减少了你的应用荚的流动性,因为它们被绑在一个节点上。但是在CockroachDB的案例中,由于每个pod的资源要求,这样做是很典型的。
我发现这种部署模式的主要挑战是,虚拟机和Kubernetes依赖于它们自己的DNS部署。为了使这个解决方案发挥作用,我们需要确保DNS的两个实例都能和谐地工作。这一点已经通过在Azure中托管一个私有DNS区并将请求从CoreDNS转发到Azure来完成。这确保了所有的pods能够成功地解析组成集群的所有节点的名称,无论它们是Kubernetes中的pods还是虚拟机。
这个演示展示了CockroachDB的真正灵活性,以及它如何在许多不同的平台上部署,它的单一二进制架构使它非常容易部署,并且非常适合在容器中运行。试一试吧以下是github repo的链接。