IP访问service

IP访问service

loadbalancer

bash 复制代码
[root@master30 ~ 11:31:02]# wget http://192.168.42.200/course-materials/softwares/stage03/metallb-0.14.8.tar.gz
--2026-06-29 11:37:43--  http://192.168.42.200/course-materials/softwares/stage03/metallb-0.14.8.tar.gz
Connecting to 192.168.42.200:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 14835368 (14M) [application/octet-stream]
Saving to: 'metallb-0.14.8.tar.gz'

metallb-0.14.8.tar.gz      100%[======================================>]  14.15M  11.3MB/s    in 1.3s

2026-06-29 11:37:45 (11.3 MB/s) - 'metallb-0.14.8.tar.gz' saved [14835368/14835368]

[root@master30 ~ 11:37:45]# tar -xf metallb-0.14.8.tar.gz
[root@master30 ~ 11:37:56]# kubectl apply -f metallb-0.14.8/config/manifests/metallb-native.yaml
namespace/metallb-system created
customresourcedefinition.apiextensions.k8s.io/bfdprofiles.metallb.io created
customresourcedefinition.apiextensions.k8s.io/bgpadvertisements.metallb.io created
customresourcedefinition.apiextensions.k8s.io/bgppeers.metallb.io created
customresourcedefinition.apiextensions.k8s.io/communities.metallb.io created
customresourcedefinition.apiextensions.k8s.io/ipaddresspools.metallb.io created
customresourcedefinition.apiextensions.k8s.io/l2advertisements.metallb.io created
customresourcedefinition.apiextensions.k8s.io/servicel2statuses.metallb.io created
serviceaccount/controller created
serviceaccount/speaker created
role.rbac.authorization.k8s.io/controller created
role.rbac.authorization.k8s.io/pod-lister created
clusterrole.rbac.authorization.k8s.io/metallb-system:controller created
clusterrole.rbac.authorization.k8s.io/metallb-system:speaker created
rolebinding.rbac.authorization.k8s.io/controller created
rolebinding.rbac.authorization.k8s.io/pod-lister created
clusterrolebinding.rbac.authorization.k8s.io/metallb-system:controller created
clusterrolebinding.rbac.authorization.k8s.io/metallb-system:speaker created
configmap/metallb-excludel2 created
secret/metallb-webhook-cert created
service/metallb-webhook-service created
deployment.apps/controller created
daemonset.apps/speaker created
validatingwebhookconfiguration.admissionregistration.k8s.io/metallb-webhook-configuration created
[root@master30 ~ 11:38:07]# kubectl get all -n metallb-system
NAME                              READY   STATUS              RESTARTS   AGE
pod/controller-6dd967fdc7-sbpkk   0/1     ContainerCreating   0          8s
pod/speaker-8jl8v                 0/1     ContainerCreating   0          8s
pod/speaker-clhqm                 0/1     ContainerCreating   0          8s
pod/speaker-xj6ng                 0/1     ContainerCreating   0          8s

NAME                              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/metallb-webhook-service   ClusterIP   10.108.21.173   <none>        443/TCP   9s

NAME                     DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
daemonset.apps/speaker   3         3         0       3            0           kubernetes.io/os=linux   8s

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/controller   0/1     1            0           8s

NAME                                    DESIRED   CURRENT   READY   AGE
replicaset.apps/controller-6dd967fdc7   1         1         0       8s
[root@master30 ~ 11:38:15]# kubectl get all -n metallb-system
NAME                              READY   STATUS              RESTARTS   AGE
pod/controller-6dd967fdc7-sbpkk   1/1     Running             0          81s
pod/speaker-8jl8v                 0/1     ContainerCreating   0          81s
pod/speaker-clhqm                 0/1     ContainerCreating   0          81s
pod/speaker-xj6ng                 0/1     ContainerCreating   0          81s

NAME                              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/metallb-webhook-service   ClusterIP   10.108.21.173   <none>        443/TCP   82s

NAME                     DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
daemonset.apps/speaker   3         3         0       3            0           kubernetes.io/os=linux   81s

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/controller   1/1     1            1           81s

NAME                                    DESIRED   CURRENT   READY   AGE
replicaset.apps/controller-6dd967fdc7   1         1         1       81s
[root@master30 ~ 11:39:28]# kubectl get all -n metallb-system
NAME                              READY   STATUS    RESTARTS   AGE
pod/controller-6dd967fdc7-sbpkk   1/1     Running   0          2m13s
pod/speaker-8jl8v                 1/1     Running   0          2m13s
pod/speaker-clhqm                 1/1     Running   0          2m13s
pod/speaker-xj6ng                 0/1     Running   0          2m13s

NAME                              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/metallb-webhook-service   ClusterIP   10.108.21.173   <none>        443/TCP   2m14s

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

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/controller   1/1     1            1           2m13s

NAME                                    DESIRED   CURRENT   READY   AGE
replicaset.apps/controller-6dd967fdc7   1         1         1       2m13s
[root@master30 ~ 11:40:20]# kubectl get all -n metallb-system
NAME                              READY   STATUS    RESTARTS   AGE
pod/controller-6dd967fdc7-sbpkk   1/1     Running   0          2m27s
pod/speaker-8jl8v                 1/1     Running   0          2m27s
pod/speaker-clhqm                 1/1     Running   0          2m27s
pod/speaker-xj6ng                 1/1     Running   0          2m27s

NAME                              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/metallb-webhook-service   ClusterIP   10.108.21.173   <none>        443/TCP   2m28s

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

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/controller   1/1     1            1           2m27s

NAME                                    DESIRED   CURRENT   READY   AGE
replicaset.apps/controller-6dd967fdc7   1         1         1       2m27s
[root@master30 ~ 11:40:34]# cat << 'EOF' > ippool.yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
  - 10.1.8.40-10.1.8.80
EOF
[root@master30 ~ 11:40:42]# kubectl apply -f ippool.yaml
配置 lay2
ipaddresspool.metallb.io/first-pool created
-bash: 配置: command not found
[root@master30 ~ 11:40:47]# cat << 'EOF' > L2.yaml
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: example
  namespace: metallb-system
EOF
[root@master30 ~ 11:40:59]# kubectl apply -f L2.yaml
l2advertisement.metallb.io/example created
[root@master30 ~ 11:41:16]# kubectl create deployment web --image=hub.laoma.cloud/library/httpd --replicas=3
deployment.apps/web created
[root@master30 ~ 11:41:51]# kubectl get pods -l app=web
NAME                   READY   STATUS    RESTARTS   AGE
web-5885dfff8c-bxdln   1/1     Running   0          6s
web-5885dfff8c-kvpd7   1/1     Running   0          6s
web-5885dfff8c-qhtdg   1/1     Running   0          6s
[root@master30 ~ 11:41:57]# kubectl expose deployment web --type LoadBalancer --port=80 --target-port=80 -o yaml --dry-run=client > service-LoadBalancer.yaml
[root@master30 ~ 11:42:08]# vim service-LoadBalancer.yaml
[root@master30 ~ 11:42:40]# kubectl apply -f service-LoadBalancer.yaml
service/web created
[root@master30 ~ 11:42:47]# kubectl get service
NAME        TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
mysql       ClusterIP      10.107.178.96    <none>        3306/TCP       66m
web         LoadBalancer   10.110.43.43     10.1.8.40     80:32556/TCP   5s
wordpress   NodePort       10.105.189.207   <none>        80:31968/TCP   58m
[root@master30 ~ 11:42:52]# curl -s http://10.1.8.40:80
<html><body><h1>It works!</h1></body></html>

金丝雀发布

bash 复制代码
[root@master30 ~ 14:06:58]# mkdir web
[root@master30 ~ 14:32:37]# echo hello nginx 1.28 > web/index28.html
[root@master30 ~ 14:32:54]# echo hello nginx 1.29 > web/index29.html
[root@master30 ~ 14:33:09]# kubectl create configmap web --from-file=./web
configmap/web created
[root@master30 ~ 14:33:20]# kubectl get configmaps web -o yaml |grep ^data -A4 data: index28.html: | hello nginx 1.28 index29.html: | hello nginx 1.29
-bash: hello: command not found
-bash: hello: command not found
grep: data:: No such file or directory
grep: index28.html:: No such file or directory
[root@master30 ~ 14:33:38]# kubectl describe configmap web
Name:         web
Namespace:    services
Labels:       <none>
Annotations:  <none>

Data
====
index28.html:
----
hello nginx 1.28

index29.html:
----
hello nginx 1.29


BinaryData
====

Events:  <none>
[root@master30 ~ 14:35:00]# vim webapp-1.28.yaml
[root@master30 ~ 14:37:03]# vim webapp-1.28.yaml
[root@master30 ~ 14:37:41]# kubectl apply -f webapp-1.28.yaml
deployment.apps/web-28 created
[root@master30 ~ 14:37:50]# vim webapp-svc.yaml
[root@master30 ~ 14:38:17]# kubectl apply -f webapp-svc.yaml
service/web configured
[root@master30 ~ 14:38:24]# kubectl get svc
NAME        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
mysql       ClusterIP   10.107.178.96    <none>        3306/TCP       4h2m
web         ClusterIP   10.110.43.43     <none>        80/TCP         175m
wordpress   NodePort    10.105.189.207   <none>        80:31968/TCP   3h53m
[root@master30 ~ 14:38:33]# kubectl delete svc mysql wordpress
service "mysql" deleted
service "wordpress" deleted
[root@master30 ~ 14:38:54]# kubectl get svc
NAME   TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
web    ClusterIP   10.110.43.43   <none>        80/TCP    176m
[root@master30 ~ 14:38:57]# vim webapp-1.29.yaml
[root@master30 ~ 14:39:20]# kubectl apply -f webapp-1.29.yaml
deployment.apps/web-29 created
[root@master30 ~ 14:39:30]# for i in {1..50}; do curl -s 10.110.43.43; done | sort -n|uniq -c
     46 hello nginx 1.28
      4 hello nginx 1.29
[root@master30 ~ 14:40:10]# kubectl scale deployment web-28 --replicas 3
deployment.apps/web-28 scaled
[root@master30 ~ 14:40:25]# kubectl scale deployment web-29 --replicas 5
deployment.apps/web-29 scaled
[root@master30 ~ 14:40:35]# for i in {1..50}; do curl -s 10.110.43.43; done | sort -n|uniq -c
     20 hello nginx 1.28
     30 hello nginx 1.29