#### 參考1:https://blog.csdn.net/MssGuo/article/details/128149704
#### 以下內容出自csdn
* ————————————————
* 版权声明:本文为CSDN博主「MssGuo」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
* 原文链接:https://blog.csdn.net/MssGuo/article/details/128149704
## 環境準備
| 主機 | 說明 |
| -------- | -------- |
| 10.135.20.1 | master节点,能连外网,ubuntu 20.04版本,至少2核CPU,2G内存 |
| 10.135.20.2|node1节点,能连外网,ubuntu 20.04版本,至少2核CPU,2G内存|
## 安裝ubuntu 20.04
...
## 機器設定
#### 主機更具實際情況需要做到如下6大步驟配置
1. 關閉防火牆
```
root@master:~# sudo ufw status # 查看目前防火牆狀態: inactive狀態是防火牆關閉 active是防火牆開啟
root@master:~# sudo ufw enable|disablle #啟動、關閉防火牆
```
2. 禁用selinux 默認ubuntu
*默认ubunt默认是不安装selinux的,如果没有selinux命令和配置文件则说明没有安装selinux,则下面步骤就不用做了
```
root@master:~#setenforce 0 #暫時關閉selinux
root@master:~#gentenforce #查看selinux狀態
Permissive
root@master:~# vim /etc/selinux/config #永久關閉selinux
```
3. 關閉swap分區(必須,因為k8s官方要求)
*注意:最好在安裝虛擬機時就不要創建swap交換分區
```
root@maswaster:~#swapoff -a
root@master:~#free -h
```
4. 設置主機名:
```
root@master:~# vim /etc/hosts
10.135.20.1 master
10.135.20.2 node1
```
5. 時間同步
```
root@master:~# date 查看時間,時區
root@master:~# timedatectl list-timezones | grep Asia #抓取所有亞洲時區
root@master:~# timedatectl set-timezone Asia/Taipei 設定台灣時區
```
6. 將橋接的IPV4流量傳到iptables的鍊
* (有一些ipv4的流量不能走iptables链,因为linux内核的一个过滤器,每个流量都会经过他,然后再匹配是否可进入当前应用进程去处理,所以会导致流量丢失),配置k8s.conf文件(k8s.conf文件原来不存在,需要自己创建的)
```
root@cdlab-k8s-master:/home/cdlab# touch /etc/sysctl.d/k8s.conf
root@cdlab-k8s-master:/home/cdlab# cat >> /etc/sysctl.d/k8s.conf << EOF
> net.bridge.bridge-nf-call-ip6tables=1
> net.brigde.bridge-nf-call-iptables=1
> net.ipv4.ip_forward=1
> vm.swappiness=0
> EOF
root@cdlab-k8s-master:/home/cdlab# sysctl --system
```
## 安裝K8S
#### 使用kubeadm安装k8s(本篇讲解使用kubeadm安装k8s)
以上6大步骤在每一台虚拟机做完之后,开始安装k8s。本篇讲解使用kubeadm安装k8s),kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具,这个工具能通过两条指令完成一个kubernetes集群的部署。
### 安裝kubeadm,kubectl,kubelet
#### 注意:以下步驟,每一台機器都需要安裝
* 準備repository
```
apt-get update
apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
```
* 指定kubeadm 版本和安裝
```
apt-cache madison kubeadm
K_VER="1.22.3-00"
apt install -y kubelet=${K_VER} kubectl=${K_VER} kubeadm=${K_VER}
sudo apt-mark hold kubelet kubectl kubeadm
```
#### 安裝docker
參考:https://www.runoob.com/docker/ubuntu-docker-install.html
* 更新 apt 包索引。
```
$ sudo apt-get update
```
* 安装 apt 依赖包,用于通过HTTPS来获取仓库:
```
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg-agent \
software-properties-common
```
* 添加 Docker 的官方 GPG 密钥:
```
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
```
* 使用以下指令设置稳定版倉庫
```
sudo add-apt-repository \
"deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/ \
$(lsb_release -cs) \
stable"
```
* 安裝特定本版docker-ce
```
$ apt-cache madison docker-ce
$ D_ver="5:20.10.10~3-0~ubuntu-focal"
$ sudo apt-get install docker-ce=${D_ver} docker-ce-cli=${D_ver} containerd.io
# Setup daemon.
## Log 的大小, Storage Driver
$cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
$ mkdir -p /etc/systemd/system/docker.service.d
# Restart docker.
$ systemctl daemon-reload
$ systemctl restart docker
```
### 初始化master節點的控制面板
```
$ kubeadm config images list
```
```
sudo kubeadm config images pull
sudo kubeadm init
```
設定config
```
$mkdir -p $HOME/.kube
$sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$sudo chown $(id -u):$(id -g) $HOME/.kube/config
```
# 請使用以下calico CNI
```
#calico
kubeadm init --pod-network-cidr=10.244.0.0/16
wget https://docs.projectcalico.org/v3.20/manifests/calico.yaml
#大约在3878行,取消注释,并改为前面kubeadm init中pod-network-cidr字段定义的网段。
#此處注意不要設定重複範圍
vim calico.yaml +3878
...
- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16"
...
kubectl apply -f calico.yaml
```
加入node
```
#生成tokern
root@cdlab-k8s-master:/home/cdlab# kubeadm token create --print-join-command
kubeadm join 10.135.20.1:6443 --token y9fmj7.6iprmhlsoq53k6qm --discovery-token-ca-cert-hash sha256:36868e1acef7b3362b3793888a3bf636dca8cc3b243b1c60d15f607bd372e94e
#將生成指令在worker節點輸入
```
## 部屬私有倉庫
#### docker運行私有倉庫
```
sudo docker run -d -p 5000:5000 registry
```
* 倉庫位置:<倉庫宿主機ip位置>:5000
```
#取的私人倉庫中的images
#如果需要進行網頁跳轉可以使用curl -L
curl http://<倉庫宿主機ip位置>:5000/v2/_catalog/
```
#### docker設定
```
$vim /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
##添加inseure-registrues
"insecure-registries" : [ "<倉庫宿主機ip位置>:5000" ]
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
```
* 更新docker daemon
```
$ systemctl daemon-reload
$ systemctl restart docker
```
## IMS檔案預先設定
#### 下載clearwater repo
##### clearwater-docker github: https://github.com/Metaswitch/clearwater-docker
```
$git clone https://github.com/Metaswitch/clearwater-docker.git
```
#### 修改Dockerfile
* 修改base中的Dockerfile,更新clearwater deb位置
* 1.將
```RUN echo deb http://repo.cw-ngv.com/stable binary/ > /etc/apt/sources.list.d/clearwater.list```
改成
```RUN echo deb http://artifacts.opnfv.org/functest/clearwater/debian ./ > /etc/apt/sources.list.d/clearwater.list```
* 2.將 ```RUN curl -L http://repo.cw-ngv.com/repo_key | apt-key add -```刪除
* 修改cassandra中的Dockerfile
* 添加```RUN sed -i "s/rpc_address: ::0/rpc_address: 0.0.0.0/" /usr/share/clearwater/cassandra/cassandra.yaml.template```添加到Dockerfile中
#### 創建images
```
# Build the Clearwater docker images.
$ cd clearwater-docker
$ for i in base astaire cassandra chronos bono ellis homer homestead homestead-prov ralf sprout ; do docker build -t clearwater/$i $i ; done
```
#### 推送創建的images到私有registry
```
$ for i in base astaire cassandra chronos bono ellis homer homestead homestead-prov ralf sprout
do
docker tag clearwater/$i:latest <倉庫宿主機ip位置>:5000/clearwater/$i:latest
docker push <倉庫宿主機ip位置>:5000/clearwater/$i:latest
done
```
#### 創建configmap
* 請輸入以下指令,創建configmap
```
$ kubectl create configmap env-vars --from-literal=ZONE=default.svc.cluster.local
```
* 如果使用hss
```
$ kubectl create configmap env-vars --from-literal=ZONE=default.svc.cluster.local --from-literal=ADDITIONAL_SHARED_CONFIG=hss_hostname=hss.example.com\nhss_realm=example.com
```
## 部屬工具 helm安裝
#### helm安裝
```
$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
$ chmod 700 get_helm.sh
$ ./get_helm.sh
```
## 生成k8s使用的yaml檔案
#### 修改k8s-gencfg.sh使生成的檔案能夠符合k8s需求的yaml檔案
#### 修改parse_file function成以下函數
```
$ cd clearwater-docker/kubernetes
$ vim k8s-gencfg
def parse_file(args,filename, input_file, output_file):
with open(input_file) as file:
input_data = file.read()
# IMAGE_SECRET is an optional argument
# ~ means null in yaml
output_data = input_data.replace("{{IMAGE_PATH}}", args.image_path) \
.replace("{{IMAGE_TAG}}", args.image_tag) \
.replace("{{IMAGE_SECRET}}", args.image_secret if (args.image_secret != None) else "~") \
.replace("extensions/v1beta1","apps/v1")
if (filename.find("depl")) != -1:
if (output_data.find("selector")) == -1:
if (filename.find("etcd-depl"))==-1:
text = """spec:
selector:
matchLabels:
service: {{replace}}"""
text = text.replace("{{replace}}",filename.split('-')[0])
output_data = output_data.replace("spec:",text,1)
else:
text = """spec:
selector:
matchLabels:
instance-type: etcd-pod"""
output_data = output_data.replace("spec:",text,1)
with open(output_file, "w") as file:
file.write(output_data)
def parse_files_in_dir(args, src, dest):
for template_file_name in os.listdir(src):
template_name = template_file_name.split('.')[0]
output_file_name = template_name + ".yaml"
print("Generate %s from %s" % (output_file_name, template_file_name))
parse_file(args, template_name ,os.path.join(src, template_file_name), os.path.join(dest, template_name+".yaml"))
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument(
'--image_path', required=True,
help='The path to the images to use')
parser.add_argument(
'--image_tag', required=True,
help='The image tag to use')
parser.add_argument(
'--image_secret', required=False,
help='(Optional) The kubernetes secret for authenticating with the container registry')
args = parser.parse_args()
# Create kubernetes manifests
template_dir = "templates"
if not os.path.isdir(template_dir):
print("This script must be run from the kubernetes directory")
parse_files_in_dir(args, src=template_dir, dest='.')
# Create helm chart
helmchart_dir = "clearwater"
helmchart_templates_dir = os.path.join(helmchart_dir, "templates")
if not os.path.exists(helmchart_templates_dir):
os.makedirs(helmchart_templates_dir)
parse_files_in_dir(args, src="helm", dest=helmchart_dir)
helm_args=parser.parse_args(args=['--image_path', '{{ .Values.image.path }}', '--image_tag', '{{ .Values.image.tag }}'])
parse_files_in_dir(helm_args, src=template_dir, dest=helmchart_templates_dir)
```
#### 執行 k8s-gencfg
```
$ ./k8s-gencfg --image_path=http://<倉庫宿主機ip位置>:5000/clearwater --image_tag=latest
```
#### helm 部屬系統
```
$ cd clearwater-docker/kubernetes
$ helm install clearwater clearwater
```
* 清除部屬
```
$helm delete clearwater
```