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