Go K8s Start
K8s入门安装之类的比较多了,这里主要记录K8s开发相关内容。。
配置介绍:
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION IP(I append)
master Ready master 9m29s v1.18.0 192.168.228.100
node1 Ready <none> 8m1s v1.18.0 192.168.228.101
node2 Ready <none> 7m53s v1.18.0 192.168.228.102
[root@master ~]# env | grep -i proxy
http_proxy=http://192.168.228.1:7890/
https_proxy=http://192.168.228.1:7890/ #代理为方便访问外面的资源
部署服务实例
这里我们使用Sockshop(较为有名的微服务实例,提供docker-compese/K8s部署指令,较为方便)
于Master节点执行以下命令以部署应用:
git clone https://github.com/microservices-demo/microservices-demo
[root@master ~]# kubectl create namespace sock-shop
namespace/sock-shop created
[root@master ~]# kubectl apply -f microservices-demo/deploy/kubernetes/complete-demo.yaml
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
namespace/sock-shop configured
deployment.apps/carts created
service/carts created
...开启了一系列的应用
查看启动状态:
[root@master ~]# kubectl get pods -n sock-shop
NAME READY STATUS RESTARTS AGE
carts-b88f67bd5-x6hrv 1/1 Running 0 6m41s
carts-db-84b777d9c-dh9fz 1/1 Running 0 6m41s
catalogue-578bc986c4-qjqqm 1/1 Running 0 6m41s
catalogue-db-5579f7f4cb-llmst 1/1 Running 0 6m41s
front-end-6598d7fdf7-vnvxb 1/1 Running 0 6m41s
orders-5cd98488c5-k2kwb 1/1 Running 0 6m41s
orders-db-77c46b9c85-ws6xn 1/1 Running 0 6m41s
payment-576b45758f-t5qks 1/1 Running 0 6m40s
queue-master-756cc8fd5f-qxll7 1/1 Running 0 6m40s
rabbitmq-7ddc84cb6c-wz8fp 2/2 Running 0 6m40s
session-db-8f64655d5-zs798 1/1 Running 0 6m40s
shipping-596cd757cc-lxgvg 1/1 Running 0 6m40s
user-65886d4ccf-q4pt2 1/1 Running 0 6m39s
user-db-79b99f877f-t9nx9 1/1 Running 0 6m39s
[root@master ~]# kubectl get service -n sock-shop
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
carts ClusterIP 10.109.71.56 <none> 80/TCP 5m37s
carts-db ClusterIP 10.103.242.233 <none> 27017/TCP 5m37s
catalogue ClusterIP 10.97.33.33 <none> 80/TCP 5m37s
catalogue-db ClusterIP 10.100.129.25 <none> 3306/TCP 5m37s
front-end NodePort 10.107.122.50 <none> 80:30001/TCP 5m37s
orders ClusterIP 10.111.73.100 <none> 80/TCP 5m37s
...
注意存在front-end
对应TYPE为NodePort
,因此我们可以通过该地址访问服务,这里的url为:192.168.228.100:30001
,界面如下:
另外部署dashboard,参考这个连接,然后通过kubectl -n kube-system describe $(kubectl -n kube-system get secret -n kube-system -o name | grep namespace) | grep token
获取token用于登录,界面如下:
这里做k8s-dashboard主要是方便开发过程中的校验(毕竟,初级开发的功能在dashboard几乎都能找到…)
go program
这里就直接在Master上进行go代码编写,简单实例代码如下:
package main
import (
"context"
"flag"
"fmt"
"math/rand"
"path/filepath"
"time"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/util/homedir"
)
func main() {
var kubeconfig *string
if home := homedir.HomeDir(); home != "" {
kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
} else {
kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
}
flag.Parse()
// use the current context in kubeconfig
config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
if err != nil {
panic(err.Error())
}
// create the clientset
clientset, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err.Error())
}
pods, err := clientset.CoreV1().Pods("").List(context.TODO(), metav1.ListOptions{})
if err != nil {
panic(err.Error())
}
fmt.Printf("There are %d pods in the cluster\n", len(pods.Items))
s1 := rand.NewSource(time.Now().UnixNano())
r1 := rand.New(s1)
num := r1.Intn(len(pods.Items))//生成真正的随机数,而不是每次都一样
fmt.Printf("%s's Host IP :%s \n", pods.Items[num].Name, pods.Items[num].Status.HostIP)
}
输出结果:
[root@master demo1]# go run main.go -kubeconfig=$HOME/.kube/config
There are 31 pods in the cluster
kube-scheduler-master's Host IP :192.168.228.100
[root@master demo1]# go run main.go -kubeconfig=$HOME/.kube/config
There are 31 pods in the cluster
shipping-596cd757cc-lxgvg's Host IP :192.168.228.102
当然,也可以通过以下代码块获取worker的资源信息:
nodes, aerr := clientset.CoreV1().Nodes().List(context.TODO(), metav1.ListOptions{})
if aerr != nil {
panic(aerr.Error())
}
num2 := 2
v1 := nodes.Items[num2].Status.Capacity.Cpu().AsDec().Scale
//输出:node 2's Total CPU 19537440
具体的client-go
使用可以直接去看源码,这里的结果也可以和dashboard比对一下。
其实也只是去调用API而已,就像kubectl
做的一样,和一些自研或者说是扩展出来的k8s还是有本质区别。