<p>I want to reserve static IP address for my k8s exposed service.
If I am not mistaken when I expose the k8s service it gets the random public IP address. I redeploy my app often and the IP changes.
But I want to get permanent public IP address.
My task is to get my application via permanent IP address (or DNS-name).</p>

<p>This is cloud provider specific, but from the tag on your question it appears you are using Google Cloud Platform's Kubernetes Engine (GKE). My answer is specific for this situation.</p>

<p>From the <a href="https://cloud.google.com/kubernetes-engine/docs/tutorials/http-balancer#step_5_optional_configuring_a_static_ip_address" rel="nofollow noreferrer">Setting up HTTP Load Balancing with Ingress</a> tutorial:</p>

<blockquote>
<pre><code>gcloud compute addresses create web-static-ip --global
</code></pre>
</blockquote>

<p>And in your Ingress manifest:</p>

<blockquote>
<pre><code>apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: basic-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: "web-static-ip"
spec:
  backend:
    serviceName: web
    servicePort: 8080
</code></pre>
</blockquote>

<p>You can do something similar if you using <a href="https://cloud.google.com/kubernetes-engine/docs/tutorials/configuring-domain-name-static-ip" rel="nofollow noreferrer">Service instead of Ingress</a>:</p>

<pre><code>apiVersion: v1
kind: Service
metadata:
  name: helloweb
  labels:
    app: hello
spec:
  type: LoadBalancer
  loadBalancerIP: "web-static-ip"
  selector:
    app: hello
    tier: web
  ports:
  - port: 80
    targetPort: 8080
</code></pre>
