k8s

简介:
Kubernetes是用于自动部署、扩展和容器化应用程序的开源系统,当使用的容器服务多了,面临的访问量增大后,就需要一种工具把这些容器统一管理起来,需要实现对这些容器的自动部署、扩展和管理,也就是俗称的容器编排,简称为K8S。

k8s 安装

1.放行端口

"所有主机"
systemctl stop ufw.service && systemctl disable ufw.service
#采用关闭防火墙 放行所有

2. 禁用交换区

"所有主机"
echo "vm.swappiness=0" >> /etc/sysctl.conf
sysctl -p
#表示禁止使用swap分区,只有当内存或硬盘不够用的时候才会使用这个分区,否则不会去使用。

#将swap开机自动挂载禁用
vim /etc/fstab 
# /swap.img     none    swap    sw      0       0、

#临时关闭 查看swap分区大小
swapoff -a
free -m

3. hosts文件 域名通信

"所有主机"
vim /etc/hosts
192.168.117.251 server1
192.168.117.252 server2
#添加对应IP
#或者采用追加方法
echo "192.168.34.2 cncamp.com" >> /etc/hosts

5.为了使Linux节点的iptables能够正确查看桥接流量,请在配置中验证是否将其设置为1。

$ cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

$ cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
$ sudo sysctl --system

6.kubernets自v1.24.0后,就不再使用docker.shim,替换采用containerd作为容器运行时端点。因此需要安装containerd(在docker的基础下安装)
6.1 安装一些依赖的系统工具

"all server"
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common'

6.2 添加 Docker 的官方 GPG 密钥

"all server"
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

6.3设置稳定版仓库

sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) \
  stable"

6.4 安装containerd.io

"all server"
sudo apt-get install containerd.io

7.将containerd用作 CRI (Container Runtime Interface)运行时
7.1将 sandbox_image 镜像源设置为阿里云google_containers镜像源

"all server"
#生成默认配置
containerd config default > /etc/containerd/config.toml
vim /etc/containerd/config.toml
45  [plugins."io.containerd.grpc.v1.cri"]
61     sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6"
#或者
sed -i "s#k8s.gcr.io/pause#registry.aliyuncs.com/google_containers/pause#g"       /etc/containerd/config.toml

7.2 配置镜像加速地址

"all server"
#配置containerd镜像加速地址
  [plugins."io.containerd.tracing.processor.v1.otlp"]
    endpoint = "https://a8x1qfbv.mirror.aliyuncs.com"
    insecure = false
    protocol = ""
#使用的是镜像加速器服务,阿里云镜像站开通

7.3 配置 cgroup 驱动程序systemd

"all server"
vim /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
  SystemdCgroup = true
#或者
sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml

7.4 应用所有更改后,重新启动containerd

"all server"
systemctl restart containerd && systemctl enable containerd

netstat -anput | grep containerd

8.安装 kubeadm、kubelet 和 kubectl

kubeadm:用于引导集群的命令。
kubelet:在集群中的所有计算机上运行并执行启动 pod 和容器等操作的组件。(由systemd管理,负责k8s的初始化)
kubectl:用于与集群通信的命令行实用程序。

8.1更新apt软件包索引并安装使用Kubernetes apt存储库所需的软件包:

$ sudo apt-get update
$ sudo apt-get install -y apt-transport-https ca-certificates curl

8.2 安装kubeadm

$ sudo curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -

8.3 添加Kubernetes apt存储库

$ sudo tee /etc/apt/sources.list.d/kubernetes.list <<-'EOF'
deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
EOF

8.4 安装kubelet, kubeadm and kubectl

$ sudo apt-get update
$ sudo apt-get install -y kubelet kubeadm kubectl
$ sudo apt-mark hold kubelet kubeadm kubectl

8.5 kubeadm init

kubeadm init \
 --image-repository registry.aliyuncs.com/google_containers \
 --kubernetes-version v1.24.1 \
 --pod-network-cidr=10.141.0.0/16 \
 --apiserver-advertise-address=10.141.65.188

保存好 kubeadm join 那一行的信息,用于后续加入节点。如果忘记可以用kubeadm token create --print-join-command来生成。

kubeadm join 10.141.65.188:6443 --token f2skts.ziahkdu7ljnw4non \
	--discovery-token-ca-cert-hash sha256:241c5573302743f7c7446e7a36c321eee5513ff1767cb3dc0c00b1bcd5201c3d

8.6 复制kubeconfig

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

8.7 Untaint master
查看节点的是否受污染

$ kubectl describe nodes |grep Tain
 
 #或者
 $ kubectl get no -o yaml | grep taint -A 5

节点污染,直接删除master节点的污点设置:

$ kubectl taint nodes --all node-role.kubernetes.io/master-

k8s创建pod一直pending

8.8 安装Kunbernets网络插件(calico cni plugin)

$ kubectl create -f https://docs.projectcalico.org/manifests/tigera-operator.yaml
$ kubectl create -f https://docs.projectcalico.org/manifests/custom-resources.yaml

8.9 Node加入集群

kubeadm join 10.141.65.188:6443 --token f2skts.ziahkdu7ljnw4non \
	--discovery-token-ca-cert-hash sha256:241c5573302743f7c7446e7a36c321eee5513ff1767cb3dc0c00b1bcd5201c3d

这里需要指定容器运行时的socket路径 默认的话还是回去寻找dockershim

"server2&server3"

kubeadm join 10.141.65.188:6443 --token f2skts.ziahkdu7ljnw4non \
--discovery-token-ca-cert-hash sha256:241c5573302743f7c7446e7a36c321eee5513ff1767cb3dc0c00b1bcd5201c3d --cri-socket=unix:///run/containerd/containerd.sock

8.10 查看pod和nodes的指令

#查看所有的名空间
$ kubectl get pod --all-namespaces 


#查看pod的yaml文档
$ kubectl get pod nginx -oymal

#删除pod
$ kubectl delete pods 容器名(NAME)#删掉1/1的容器

#重启pod
$ kubectl get pod {podname} -n {namespace} -o yaml | kubectl replace --force -f -

#查看k8s的master控制面板插件
$ kubectl get pod -n kube-system

#启动etcd
$ kubectl exec -it etcd-cyl sh -n kube-system


#查看节点
$ kubectl get nodes

#查看节点的yaml文档
$ kubectl get node -oyaml

#编辑pod内容
$ kubectl edit po <podName>

#停止k8s,不会启容器了:
$ kubectl drain 10.136.2.73     
#启动:
$ kubectl uncordon 10.136.2.73

kubectl常用指令

kubectl get po <podName> /ep <endpoint>/rs<replicaSet> /svc <service> / deploy <deployment>/configMap/secret/  -oyaml -w
#-oyaml 输出详细信息为 yaml 格式。
#-w watch 该对象的后续变化。
#-owide 以详细列表的格式查看对象。

kubectl describe 展示资源的详细信息和相关 Event。

kubectl describe pod <podName>

将pod进行缩容操作 让其为0 即等同于停止操作

$ kubectl scale --replicas=0  deployment/<your-deployment>

Kubectl logs 可查看 pod 的标准输出(stdout, stderr),与 tail 用法类似。

kubectl logs <-f>  <podName>
若日志信息存放在pod内,可通过exec查询
kubectl exec -it nginx -- tail -f /root/access.log

kubectl exec 提供进入运行容器的通道,可以进入容器进行 debug 操作。

kubectl exec -it etcd-cyl sh -n kube-system

查看kubectl 提供指令的 长名和短名形式

kubectl api-resources

kubectl expose 创建服务svc对象

kubectl expose deployment <nginx-app> --port=80 --target-port=80
或
kubectl expose deployment <nginx-deployment> selector  app=nginx(label)  --port=80 --type=NodePort
查看po的label
kubectl get po --show -labels

Kubernetes 通过 Cgroups 提供容器资源管理的功能,可以限制每个容器的CPU 和内存使用
可以通过下面的命令限制nginx 容器最多只用 50% 的 CPU 和 128MB 的内存:

$ kubectl set resources deployment nginx-deployment <deploymentName> -c=nginx --limits=cpu=500m,memory=128Mi

创建configmap对象:
方式一:读取文件的方式,将文件中的内容用于创建configmp

#用于配置的文件
cat game.properties
#configmap from file
kubectl create configmap game-config --from-file=game.properties
kubectl create configmap game-env-config --from-env-file=game.properties
kubectl get configmap -oyaml game-config

方式二:ConfigMap from literal,创建短小内容,直接赋值的configmap

kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm
#-- from-literal=xx 后跟的即是configmap中的data部分

8.11 simple pod demo
Run nginx as webserver

$ kubectl run --image=nginx nginx
$ kubectl run --image=nginx nginx --restart='Always'

Show running pod

$ kubectl get po --show-labels -owide -w

Expose svc

$ kubectl expose deploy nginx --selector run=nginx --port=80 --type=NodePort

Nginx-deployment Check svc detail

$ kubectl get svc

Access service

$ curl 192.168.34.2:<nodeport>


  1. kubadm init 失败,初始化失败时的解决方法

9.1 每次执行kubeadm init初始化k8s集群之前,先执行kubeadm reset指令,如若不执行,会出现额外的错误比如xxx already exists和Port xxx is in use。

9.2 在执行kubeadm init时若遇到如下错误:

[ERROR CRI]: container runtime is not running: output: time="2022-05-18T11:36:02+08:00" level=fatal msg="getting status of runtime: rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.RuntimeService"
, error: exit status 1

执行:

rm /etc/containerd/confi
 systemctl restart containerd

再次执行kubeadm init

9.3 手动拉取构建
kubeadm init初始化默认从k8s.gcr.io拉取镜像文件,但是国内无法访问k8s.gcr.io,我们可以从阿里云中拉取镜像文件,再改tag成 【k8s.gcr.io/xxxx:版本号】形式。


etcdctl --endpoints https://localhost:2379 --cert /etc/kubernetes/pki/etcd/server.crt --key /etc/kubernetes/pki/etcd/server.key --cacert /etc/kubernetes/pki/etcd/ca.crt watch --prefix /registry/pods/default/nginx