---
# System prepended metadata

title: 請使用以下calico CNI
tags: [k8s與vims]

---

#### 參考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 
```
