# 启动k8s服务

# kubeadm、kubelet、kubectl简介

参照前一篇的文章,在k8s-master和k8s-node节点上都安装了kubeadm、kubelet、kubectl服务。

Kubeadm是一个提供了 kubeadm init 和 kubeadm join 的工具,作为创建 Kubernetes 集群的 “快捷途径” 的最佳实践。kubeadm 通过执行必要的操作来启动和运行最小可用集群。 按照设计,它只关注启动引导,而非配置机器。同样的, 安装各种 “锦上添花” 的扩展,例如 Kubernetes Dashboard、 监控方案、以及特定云平台的扩展,都不在讨论范围内。相反,我们希望在 kubeadm 之上构建更高级别以及更加合规的工具, 理想情况下,使用 kubeadm 作为所有部署工作的基准将会更加易于创建一致性集群。

kubelet 是在每个 Node 节点上运行的主要 “节点代理”。它可以使用以下之一向 apiserver 注册: 主机名(hostname);覆盖主机名的参数;某云驱动的特定逻辑。kubelet 是基于 PodSpec 来工作的。每个 PodSpec 是一个描述 Pod 的 YAML 或 JSON 对象。 kubelet 接受通过各种机制(主要是通过 apiserver)提供的一组 PodSpec,并确保这些 PodSpec 中描述的容器处于运行状态且运行状况良好。 kubelet 不管理不是由 Kubernetes 创建的容器。

你可以使用 Kubectl 命令行工具管理 Kubernetes 集群。 kubectl 在 $HOME/.kube 目录中查找一个名为 config 的配置文件。 你可以通过设置 KUBECONFIG 环境变量或设置 --kubeconfig 参数来指定其它 kubeconfig 文件。

# 启动master节点

# 在master机器商运行如下明令
$ sudo kubeadm init --control-plane-endpoint "k8s.cnblogs.com:6443" --upload-certs --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16

# --control-plane-endpoint string 为控制平面指定一个稳定的 IP 地址或 DNS 名称。
# --upload-certs 将控制平面证书上传到 kubeadm-certs Secret
# --image-repository string     默认值:"k8s.gcr.io" 选择用于拉取控制平面镜像的容器仓库
# --pod-network-cidr string 指明 pod 网络可以使用的 IP 地址段。如果设置了这个参数,控制平面将会为每一个节点自动分配 CIDRs。

# 安装成功后显示以下提示信息 按照提示信息操作
Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of the control-plane node running the following command on each as root:

  kubeadm join k8s.cnblogs.com:6443 --token g4mcrb.9tzs4qwkuk4ccdkl \
        --discovery-token-ca-cert-hash sha256:1c0ae36b1c28ea6c7d3092f85614fed02281be851034c04cd3260792f0481f98 \
        --control-plane --certificate-key 7bb2e92f9fbf21eb05b2dc88e19de2dbbdd9471dea646c8fc9fdaa099e8661c9

Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join k8s.cnblogs.com:6443 --token g4mcrb.9tzs4qwkuk4ccdkl \
        --discovery-token-ca-cert-hash sha256:1c0ae36b1c28ea6c7d3092f85614fed02281be851034c04cd3260792f0481f98 

# 以非管理员身份运行kubectl

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

# node节点
$  mkdir -p $HOME/.kube
# 从master节点复制文件
$  sudo scp /etc/kubernetes/admin.conf 192.168.64.130:/usr/local/webdata/.kube/config
$  sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 在node节点上加入k8s集群

# 在node节点host增加k8s.cnblogs.com解析 解析到master节点ip
$ echo 192.168.64.128 k8s.cnblogs.com >> /etc/hosts
# 加入k8s集群
$ kubeadm join k8s.cnblogs.com:6443 --token g4mcrb.9tzs4qwkuk4ccdkl \
        --discovery-token-ca-cert-hash sha256:1c0ae36b1c28ea6c7d3092f85614fed02281be851034c04cd3260792f0481f98 

# 查看集群情况

$ kubectl cluster-info
Kubernetes control plane is running at https://k8s.cnblogs.com:6443
CoreDNS is running at https://k8s.cnblogs.com:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

$ kubectl get node
NAME             STATUS   ROLES                  AGE     VERSION
192.168.64.128   Ready    control-plane,master   111m    v1.23.4
192.168.64.129   Ready    <none>                 6m32s   v1.23.4
192.168.64.130   Ready    <none>                 7m5s    v1.23.4

# 安装POD网络

# 要让Kubernetes Cluster能够工作,必须安装Pod网络,否则Pod之间无法通信。Kubernetes支持多种网络方案,这里我们先使用flannel。
$ kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml