kuberneteskubeadmkubeletflannelcalico

Kubernetes cluster with flannel - port forwarding


Setup on machine:

On my working machine I installed Jenkins on cluster and want to configure network to be able to access jenkins from port 8081. By default it's possible only to forwarded port (30667 in my case). Is it possible on ubuntu?

NAME                           READY   STATUS    RESTARTS   AGE
pod/jenkins-5b6cb84957-n497l   1/1     Running   4          93m

NAME                 TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE
service/jenkins      LoadBalancer   10.96.81.85   <pending>     8081:30667/TCP   93m
service/kubernetes   ClusterIP      10.96.0.1     <none>        443/TCP          94m

NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/jenkins   1/1     1            1           93m

NAME                                 DESIRED   CURRENT   READY   AGE
replicaset.apps/jenkins-5b6cb84957   1         1         1       93m

NAME                              COMPLETIONS   DURATION   AGE
job.batch/pv-recycler-generator   1/1           5s         42s

Tried also with calico network plugin - same result

But before I worked with Docker desktop on Mac and Windows where it was possible out of box


Solution

  • Service type of Loadbalancer works best when you run it on cloud because cloud provisioners will automate the process of creating external loadbalancer for you and configuring it to work with Kubernetes. In case when working on prem this whole process has to be done by you. You have do it yourself or use 3rd party tools to do that, e.g. Metallb.

    Notice the pending field in the External-ip column. The easiest way would be to set it manually to IP address of your node.

    First you have get your node ip:

    āžœ  ~ k get node -owide
    NAME         STATUS     ROLES    AGE    VERSION      INTERNAL-IP     EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION    CONTAINER-RUNTIME
    instance-1    Ready      master   221d   v1.17.0  šŸ‘‰ 10.128.15.230   <none>        Ubuntu 16.04.6 LTS   4.15.0-1090-gcp   docker://18.6.1
    

    Then add this IP address in the externalIPs field in the service spec:

    āžœ  ~ cat loadbalancer.yml 
    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
    spec:
      externalIPs: 
      - 10.128.15.230 šŸ‘ˆ
      selector:
        app: MyApp
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
      type: LoadBalancer
    

    One you do that you will be able to see that external IP is no longer pending:

    NAME                  TYPE           CLUSTER-IP        EXTERNAL-IP     PORT(S)                      AGE
    my-service            LoadBalancer   10.101.150.192 šŸ‘‰ 10.128.15.230   80:11438/TCP                 5m1s
    

    And then you just have use that external IP with the nodePort that kube-proxy opened on that node:

    āžœ  ~ curl 10.128.15.230:11438 
    {
      "path": "/",
      "headers": {
        "host": "10.128.15.230:11438",
        "user-agent": "curl/7.47.0",
        "accept": "*/*"
      },
      "method": "GET",
      "body": "",
      "fresh": false,
      "hostname": "10.128.15.230",
      "ip": "::ffff:10.128.15.230",
      "ips": [],
      "protocol": "http",
      "query": {},
      "subdomains": [],
      "xhr": false,
      "os": {
        "hostname": "label-demo"
      },
      "connection": {}