本地环境安装ubuntu+helm+cilium+metallb+higress

安装ubuntu与k8s

1master ubuntu23.10
1node   ubuntu23.10
1node   ubuntu22.04
1.安装ubuntu live版本
具体略
下一步下一步即可
2.设置静态ip
vim /etc/netplan/50-cloud-init.yaml
network:
    ethernets:
        ens33:
            dhcp4: no
            addresses: [192.168.0.11/24]
            gateway4: 192.168.0.2
            nameservers:
                addresses: [192.168.0.2]
    version: 2
3.设置时区与时间(24小时制)
cento无需设置24小时制
ubuntu系统改变24小时制度

第一步骤:
vi /etc/profile
在最后一行加上:export LC_TIME=POSIX
source /etc/profile
执行date,此时变为了24小时制,断开终端重新连接,依然为24小时制

or
LC_TIME=en_DK.UTF-8
/etc/default/locale

改变时区

ln -svn /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
再不行就执行如下
timedatectl set-timezone Asia/Shanghai
------------------------------------------------------------
4.设置主机名称
hostnamectl set-hostname master
5.停止防火墙
systemctl stop firewalld && systemctl disable firewalld
6.停止swapoff与永久性关闭
swapoff -a;sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab

将桥接的IPv4流量传递到iptables的链
cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
EOF

sysctl --system;sysctl -p

如果出现 缺少文件的现象c

sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: 没有那个文件或目录

则确认是否驱动加载完成
modprobe br_netfilter
modprobe bridge

如上命令只是暂时
将echo -e "br_netfilter\nbridge" >/etc/modules-load.d/k8s.conf

7.设置时间同步
sudo apt install -y chrony
sudo systemctl restart chrony
sudo systemctl status chrony

8.安装containerd
apt install containerd -y

添加配置containerd
(pause修改不修改在于如下命令,查看k8s的版本需要的pasuse的版本
kubeadm config images list --kubernetes-version=v1.28.2
)
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
sed -i '/SystemdCgroup/s/false/true/g' /etc/containerd/config.toml
sed -i '/sandbox_image/s/registry.k8s.io/registry.aliyuncs.com\/google_containers/g' /etc/containerd/config.toml
sed -i 's/pause:3.6/pause:3.9/g'  /etc/containerd/config.toml

9.添加k8s的key
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -

添加k8s源
vim /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main

搜索kubeadm kubelet kubectl版本
apt-cache madison kubeadm kubelet kubectl|grep 1.28

安装k8s版本
apt-get -y install kubelet=1.28.2-00 kubeadm=1.28.2-00 kubectl=1.28.2-00

锁定k8s版本
apt-mark hold kubelet kubeadm kubectl

安装命令补全
apt-get install bash-completion
or
source <(kubectl completion bash) #报错 _get_comp_words_by_ref: command not found就执行如下命令
or
source /etc/bash_completion

10.列出镜像
kubeadm config images list --kubernetes-version=v1.28.2

初始化
kubeadm init  --apiserver-advertise-address=192.168.0.11  --image-repository registry.aliyuncs.com/google_containers  --kubernetes-version v1.28.2  --service-cidr=10.96.0.0/12  --pod-network-cidr=10.244.0.0/16  --ignore-preflight-errors=all


11.查看下载的镜像,会报错(cri ctrctl都会报错)
crictl image ls
WARN[0000] image connect using default endpoints: [unix:///var/run/dockershim.sock unix:///run/containerd/containerd.sock unix:///run/crio/crio.sock unix:///var/run/cri-dockerd.sock]. As the default settings are now deprecated, you should set the endpoint instead. 
E0129 23:27:29.119236   13146 remote_image.go:119] "ListImages with filter from image service failed" err="rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing dial unix /var/run/dockershim.sock: connect: no such file or directory\"" filter="&ImageFilter{Image:&ImageSpec{Image:ls,Annotations:map[string]string{},},}"
FATA[0000] listing images: rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing dial unix /var/run/dockershim.sock: connect: no such file or directory"

cat >  /etc/crictl.yaml << EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 2
#debug: true
pull-image-on-create: false
EOF

或执行如下命令生成文件
crictl config runtime-endpoint unix:///var/run/containerd/containerd.sock
crictl config image-endpoint unix:///run/containerd/containerd.sock

复制秘钥

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

kubectl get node
NAME     STATUS   ROLES           AGE   VERSION
master   Ready    control-plane   20h   v1.28.2
node-1   Ready    <none>          19h   v1.28.2
node-2   Ready    <none>          19h   v1.28.2

安装helm+cilium

1.安装helm
curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
or
wget signing.asc
cat signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null

2.添加helm源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
apt-get update

3.安装helm
apt-get install helm -y

4.使用helm添加cilium源
helm repo add cilium https://helm.cilium.io

helm repo list

helm install cilium cilium/cilium \
    --namespace kube-system \
    --set tunnel=disabled \
    --set autoDirectNodeRoutes=true \
    --set ipv4NativeRoutingCIDR="10.0.0.0/8" \
    --set kubeProxyReplacement=strict \
    --set k8sServiceHost=192.168.0.11 \
    --set k8sServicePort=6443 \
    --set bpf.masquerade=true \
    --set hubble.relay.enabled=true \
    --set hubble.ui.enabled=true \
    --set prometheus.enabled=true \
    --set operator.prometheus.enabled=true \
    --set hubble.enabled=true \
    --set hubble.metrics.enabled="{dns,drop,tcp,flow,port-distribution,icmp,http}"

--namespace kube-system:
默认安装在default namespace。由于clium cli默认cilium相关pod运行在kube-system namespace,于是这里在安装时指定kube-system namespace
--set autoDirectNodeRoutes=true:
等同于为cilium agent开启--auto-direct-node-routes flag。当所有的kubernetes节点都存在同一个L2网络上,开启该flag会让cilium调用github.com/vishvananda/netlink包,创建kubernetes节点之间的路由规则,使得跨kubernetes节点的pod网络数据包能够在不经过封装(encapsulation)的情况下路由到目的节点。
--set ipv4NativeRoutingCIDR="10.0.0.0/8":
等同于为cilium agent设置--ipv4-native-routing-cidr flag,默认为空
--set k8sServiceHost=172.18.0.4:
kubernetes apiserver地址
--set k8sServicePort=6443:
kubernetes apiserver端口
tunnel=disabled:表示不使用隧道,可以取vxlan、geneve或disabled
autoDirectNodeRoutes=true:表示由cilium在主机上生成Pod的路由规则
kubeProxyReplacement=strict:表示强制替代kube-proxy,可取值disabled,partitial等
k8sServiceHost/k8sServicePort:当要替代kube-proxy时,这两个参数必须填写,否则cilium会默认使用10.96.0.1去连接apiserver,导致连不上(因为10.96.0.1的转发此时是由cilium来实现)
如果想安装hubble,则可以设置参数hubble.relay.enabled=true,hubble.ui.enabled=true。
bpf.masquerade=true开启ebpf技术的网络地址转换(NAT)功能,开启这个功能会让Cilium使用ebpf实现类似iptables的SNAT功能


cilium install \
--version 1.14.5 \  # 指定要安装得cilium版本
--set k8sServiceHost=192.168.0.2 \ # 连接Kubernetes API服务的地址
--set k8sServicePort=6443 \  # 连接Kubernetes API服务的端口
--set cluster.name=prvite-kubernetes \  # cilium集群得名称
--set cluster.id=1 \    # cilium集群得id
--set kubeProxyReplacement=true \  # 是否替代kube-proxy
--set hubble.enabled=true \  # 是否启用流量监控和分析功能Hubble
--set hubble.ui.enabled=true \  # 是否启用Hubble UI界面
--set hubble.relay.enabled=true \ # 是否启用中继功能
--set hubble.relay.service.type=NodePort \ # 开启hubble的中继功能后,使用NodePort类型服务,使Hubble中继服务能够从集群外通过Node端口访问
--set hubble.relay.service.nodePort=31234 \  # NodePort指定的端口
--set nodeinit.enabled=true \  # 会在每个节点上执行初始化任务,安装和配置必要的环境
--set rollOutCiliumPods=true \  # 是否重新启动所有Cilium Pod
--set bpfClockProbe=true \  # 是否开启bpf时钟探测功能,开启改功能能够更准确地计算网络延时
--set operator.replicas=2 \  # Cilium Operator的副本数
--set loadBalancer.mode=dsr \  # 负载均衡模式
--set tunnel=disabled \  # 是否启用封装模式
--set autoDirectNodeRoutes=true \  # 是否自动创建节点直接路由,为每个节点创建直接到这个节点的路由规则,对于同一物理网络内的K8s集群,开启这个功能可以加速节点通信
--set ipam.mode="multi-pool" \ # IPAM模式
--set ipv4NativeRoutingCIDR="10.10.0.0/16" \  # 参数决定了Cilium在IPv4网络模式下的原生路由功能允许的IP地址范围,也就是说,10.10.0.0/16网段内的数据包交换直接使用Linux iptables转发,不走 Tunneling 隧道模式
--set ipam.operator.autoCreateCiliumPodIPPools.default.ipv4.cidrs='{10.10.0.0/16}' \  # 自动为部署在集群内的Cilium Pod分配IPv4地址,无需手动指定IP
--set ipam.operator.autoCreateCiliumPodIPPools.default.ipv4.maskSize=24 \  #这个参数指定了在该网段内给Pod分配IP时,子网掩码长度为24位
--set bpf.masquerade=true \  # 开启ebpf技术的网络地址转换(NAT)功能,开启这个功能会让Cilium使用ebpf实现类似iptables的SNAT功能
--set enableIpv4Masquerade=true \ # 表示打开Ipv4网络伪装(masquerade)功能,对从集群内部发往外网的Ipv4流量做Source NAT地址转换
--set enableIpv6Masquerade=false \ # ipv6网络伪装功能关闭
--set endpointRoutes.enabled=true \ # 为每个K8s Pod动态生成一条路由规则,使其他Pod可以直接使用Pod IP和端口进行通信,而不需要经过服务的代理
--set-string extraConfig.enable-local-node-route=false \ # 是否启用节点本地路由功能
--set ipMasqAgent.config.nonMasqueradeCIDRs='{10.10.0.0/16}' \ # 用来指定哪些CIDR范围内的IP地址不进行网络地址转换(NAT)
--set ipMasqAgent.config.masqLinkLocal=false \ # 不对Link-Local范围内流量进行SNAT,Link-Local地址范围为169.254.0.0/16
--set devices=$DEVICES \  # 只针对eth0接口配置iptables规则,如网络地址转换、安全策略
--set bpf.preallocateMaps=true \ # 是否启用ebpf map来保存过滤规则和状态信息
--set routingMode=native \  # native表示原生路由模式
--set bandwidthManager.enabled=true  \ # 启用带宽管理功能,带宽管理功能可以帮助限制Pod/NS的网络带宽使用
--set bandwidthManager.bbr=true \ # 指定带宽管理算法,BBR是一种新的带宽管理算法,全称为"Bottleneck Bandwidth and RTT"
--set loadBalancer.acceleration=native # 负载均衡加速方式, native表示使用内核原生IPVS模块进行负载均衡

----------------------
集群已经部署了cililum,因此我们可以直接通过修改configmap的方式开启kube-proxy-replacement;修改cilium-config,将kube-proxy-replacement: disabled修改为kube-proxy-replacement: strict

重启
kubectl rollout restart ds/cilium deployment/cilium-operator -n kube-system

默认情况下cilium不会允许集群外的机器访问clusterip,需要开启这个功能的话可以在配置中添加bpf-lb-external-clusterip: "true"

kubectl get cm -n kube-system cilium-config -o yaml | grep bpf-lb-external-clusterip
bpf-lb-external-clusterip: "true"

我们已经配置了该集群的podIP、clusterIP和loadbalancerIP均为集群外路由可达,即可ping通,可正常请求。此时已经开启了cilium的kube-proxy-replacement模式之后,只有pod IP是能正常ping通并请求的;loadbalancerIP和clusterIP都是无法ping通,但是能正常请求;主要原因是cilium本身的eBPF代码默认并没有对loadbalancerIP和clusterIP的icmp数据包进行处理,导致ping请求无法被响应。

---------------------
ipv4NativeRoutingCIDR[cilium]与--service-cidr[k8s]不知道可不可以重叠,未测试
----------------------
参考地址:https://www.dqzboy.com/12467.html

将cilium替代kube-proxy

停用kube-proxy
1.二进制部署的kube-proxy 执行下面的命令
systemctl disable kube-proxy && systemctl stop kube-proxy && systemctl status kube-proxy | grep Active
or
# kube-proxy以Pod方式运行(kubeadm)安装的方式

kubectl -n kube-system delete ds kube-proxy
kubectl -n kube-system delete cm kube-proxy

2.删除iptables规则(记得备注,本地环境无需备份)
删除 kube-proxy在[每台]节点生成的 iptables 配置
iptables-save | grep -v KUBE | iptables-restore

确认是否取代kube-proxy
kubectl exec -it -n kube-system ds/cilium -- cilium status | grep KubeProxyReplacement
KubeProxyReplacement:    Strict     #成功了

Cilium 取代 kube-proxy 之后,通过 service NodePort 暴露的端口在 node 服务器上用 netstat -lntp 命令查看不到,要通过 cilium 命令查看
kubectl exec -it -n kube-system daemonset/cilium -- cilium service list
Defaulted container "cilium-agent" out of: cilium-agent, config (init), mount-cgroup (init), apply-sysctl-overwrites (init), mount-bpf-fs (init), clean-cilium-state (init), install-cni-binaries (init)
ID   Frontend             Service Type   Backend                           
1    10.96.0.10:53        ClusterIP      1 => 10.0.1.57:53 (active)        
                                         2 => 10.0.1.76:53 (active)        
2    10.96.0.10:9153      ClusterIP      1 => 10.0.1.57:9153 (active)      
                                         2 => 10.0.1.76:9153 (active)      
3    10.96.0.1:443        ClusterIP      1 => 192.168.0.11:6443 (active)   
4    10.99.206.212:443    ClusterIP      1 => 192.168.0.13:4244 (active)   
5    10.104.239.108:80    ClusterIP      1 => 10.0.1.105:4245 (active)     
6    10.106.199.15:80     ClusterIP      1 => 10.0.1.87:8081 (active)      
7    10.101.173.69:80     ClusterIP      1 => 10.0.2.91:80 (active)        
8    192.168.0.13:31195   NodePort       1 => 10.0.2.91:80 (active)        
9    0.0.0.0:31195        NodePort       1 => 10.0.2.91:80 (active)

----------------
kubectl get all -n kube-system |grep cilium
pod/cilium-htv56                       1/1     Running   0               178m
pod/cilium-operator-6f865fb466-7rchg   1/1     Running   0               178m
pod/cilium-operator-6f865fb466-v66sh   1/1     Running   0               178m
pod/cilium-r7sgn                       1/1     Running   0               178m
pod/cilium-z5xbh                       1/1     Running   0               178m
service/cilium-agent     ClusterIP   None             <none>        9964/TCP                 178m
daemonset.apps/cilium   3         3         3       3            3           kubernetes.io/os=linux   178m
deployment.apps/cilium-operator   2/2     2            2           178m
replicaset.apps/cilium-operator-6f865fb466   2         2         2       178m

安装metallb

1.添加
helm repo add bitnami https://charts.bitnami.com/bitnami

2.创建命名空间
helm create --namespace  name metallb-system
或
kubectl create namespace  metallb-system


3.安装
helm install metallb bitnami/metallb --namespace metallb-system --create-namespace

4.列出命名空间
helm ls --all-namespaces
重启proxy
kubectl get pod -n kube-system | grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'
或
kubectl rollout restart daemonset kube-proxy -n kube-system
5.安装mettllb后执行如下yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: ip-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.0.200-192.168.0.230  #分配给LB的IP池
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: l2adver
  namespace: metallb-system

kubectl apply -f meta.yaml 
--------------------------

kubectl get all -n metallb-system
NAME                                      READY   STATUS    RESTARTS   AGE
pod/metallb-controller-599dbdfdb4-crmcj   1/1     Running   0          48m
pod/metallb-speaker-dwgm6                 1/1     Running   0          48m
pod/metallb-speaker-wjwn9                 1/1     Running   0          48m

NAME                              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/metallb-webhook-service   ClusterIP   10.110.221.45   <none>        443/TCP   48m

NAME                             DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
daemonset.apps/metallb-speaker   2         2         2       2            2           kubernetes.io/os=linux   48m

NAME                                 READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/metallb-controller   1/1     1            1           48m

NAME                                            DESIRED   CURRENT   READY   AGE
replicaset.apps/metallb-controller-599dbdfdb4   1         1         1       48m


创建loadbanalce的将会分配地址
-------------------------------------
如果如上的分给LB的ip地址池将要修改,会出现后续创建的ip还是在此区间【192.168.0.200-192.168.0.230】
解决办法如下两种办法
1.重新安装metallb软件(已验证)
2.修改第五步后的地址池后,重新执行第五步,再将pod删除后会重新生成新的ip地址池(未验证),kubectl delete pod -n metallb-system
-----------------------------------------------------------
假如使用helm安装的,手动将某些删除了,但是还有遗留,请使用第二种命令
1.卸载
helm uninstall metallb bitnami/metallb --namespace metallb-system
2.删除all
helm template  metallb bitnami/metallb --namespace metallb-system| kubectl delete -f -

安装阿里云higress

1.添加helm源
helm repo add higress.io https://higress.io/helm-charts
2.安装
helm install higress -n higress-system higress.io/higress --create-namespace --render-subchart-notes --set global.local=true --set higress-console.o11y.enabled=false  --set higress-console.domain=console.higress.io


--------------------
kubectl get all -n higress-system
NAME                                      READY   STATUS    RESTARTS   AGE
pod/higress-console-565b4f47bc-nrckb      1/1     Running   0          42m
pod/higress-controller-55b774886f-t9dmb   2/2     Running   0          42m
pod/higress-gateway-6b88f8df64-xlqgs      1/1     Running   0          42m

NAME                         TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)                                                    AGE
service/higress-console      LoadBalancer   10.111.92.43   192.168.0.201   8080:30620/TCP                                             42m
service/higress-controller   ClusterIP      10.108.77.7    <none>          8888/TCP,15051/TCP,15010/TCP,15012/TCP,443/TCP,15014/TCP   42m
service/higress-gateway      LoadBalancer   10.105.220.6   192.168.0.200   80:32265/TCP,443:31558/TCP                                 42m

NAME                                 READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/higress-console      1/1     1            1           42m
deployment.apps/higress-controller   1/1     1            1           42m
deployment.apps/higress-gateway      1/1     1            1           42m

NAME                                            DESIRED   CURRENT   READY   AGE
replicaset.apps/higress-console-565b4f47bc      1         1         1       42m
replicaset.apps/higress-controller-55b774886f   1         1         1       42m
replicaset.apps/higress-gateway-6b88f8df64      1         1         1       42m

参考地址:https://cloud.tencent.com/developer/article/2336673
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值