一、准备

服务器准备

服务器功能ip备注
A管理节点、工作节点10.10.xx.13x
B工作节点10.10.xx.23x
C工作节点10.10.xx.xx

概念

master

  • kubectl:kubectl是kubenetes命令行工具,通过kubectl可以部署和管理应用,查看各种资源,创建,删除和更新组件。
  • kubeadm:用于初始化cluster。

node

  • Kubelet:运行在cluster所有节点上,负责启动POD和容器。
  • Kube-proxy:Service使用其将链接路由到Pod,如上文所述。
  • Docker或Rocket:Kubernetes使用的容器技术来创建容器。

  • Pod:Pod是一个或多个容器的组合,这些容器共享存储、网络和命名空间,以及如何运行的规范。Pod是Kubernetes的最小可部署单元。Pod的中文译词是豌豆荚,docker容器就像是豆子运行在豌豆荚内。
  • ReplicaSet:先说下Replication Controller。Replication Controller的作用是确保Pod以指定的副本个数运行。
    ReplicaSet是Replication Controller升级版。ReplicaSet和Replication Controller之间的唯一区别是对选择器支持。Replication Controller只支持基于等式的selector(env=dev或environment!=qa),但ReplicaSet还支持新的,基于集合的selector(version in (v1.0,v2.0)或env notin (dev, qa))。
    在yaml文件中通过spec.replicas声明pod的副本数。
  • Deployment:Deployment用于管理Pod、ReplicaSet,可实现滚动升级和回滚应用、扩容和缩容。
  • Service:试想一个问题,ReplicaSet定义了pod的数量是2,当一个pod由于某种原因停止了,ReplicaSet会新建一个pod,以确保运行中的pod数量始终是2。但每个pod都有自己的ip,前端请求不知道这个新pod的ip是什么,那前端的请求如何发送到新pod中呢?
    答案是使用Service。
    k8s的Service定义了一个服务的访问入口地址,前端的应用通过这个入口地址访问其背后的一组由Pod副本组成的集群实例,来自外部的访问请求被负载均衡到后端的各个容器应用上。Service与其后端Pod副本集群之间则是通过Label Selector实现关联。
    请说人话:前端请求不是直接发送给Pod,而是发送到Service,Service再将请求转发给pod。

总结一下:Pod被ReplicaSet管理,ReplicaSet控制pod的数量;ReplicaSet被Deployment管理,Deployment控制pod应用的升级、回滚,当然也能控制pod的数量。Service提供一个统一固定入口,负责将前端请求转发给Pod。

环境准备

  1. 借助ntp服务设置各节点的时间同步

    yum -y install chrony
    systemctl start chronyd && systemctl enable chronyd
    chronyc sources
  2. 通过DNS完成各节点名称解析,测试环境主机,测试用hosts文件代替(各个节点同步设置)

    10.10.10.137 k8s-master01
    10.10.10.236 k8s-node01
    10.10.10.52 k8s-node02
    
    hostnamectl set-hostname k8s-master01
    hostnamectl set-hostname k8s-node01
    bash
  3. 配置ssh免密登入

    ssh-keygen -t rsa
    ssh-copy-id k8s-node01
    ssh-copy-id k8s-node02
  4. 禁用SELinux&禁用Swap设备

    swapoff -a && sed -i '/ swap / s/^\\(.*\\)$/#\\1/g' /etc/fstab
    setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
    free -m
  5. 关闭各节点iptables和firewalld服务(可选择打开端口

1|k8s master需要开启以下端口

firewall-cmd --permanent --add-port=6443/tcp
firewall-cmd --permanent --add-port=2379-2380/tcp
firewall-cmd --permanent --add-port=10248/tcp
firewall-cmd --permanent --add-port=10249/tcp
firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10251/tcp
firewall-cmd --permanent --add-port=10252/tcp
firewall-cmd --permanent --add-port=10255/tcp
firewall-cmd --permanent --add-port=8472/udp
firewall-cmd --permanent --add-port=443/udp
firewall-cmd --permanent --add-port=53/udp
firewall-cmd --permanent --add-port=53/tcp
firewall-cmd --permanent --add-port=9153/tcp
# only if you want NodePorts exposed on control plane IP as well
firewall-cmd --permanent --add-port=30000-32767/tcp
firewall-cmd --add-masquerade --permanent
firewall-cmd --reload
systemctl restart firewalld

2|k8s node需要开启以下端口

firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10255/tcp
firewall-cmd --permanent --add-port=8472/udp
firewall-cmd --permanent --add-port=443/udp
firewall-cmd --permanent --add-port=30000-32767/tcp
firewall-cmd --permanent --add-port=53/udp
firewall-cmd --permanent --add-port=53/tcp
firewall-cmd --permanent --add-port=9153/tcp
firewall-cmd --add-masquerade --permanent
systemctl restart firewalld

8472/udp为flannel的通信端口

443/tcp 为Kubernetes server端口

注意一点:一定要执行以下命令打开NAT,默认是关闭状态,这里踩过坑!!

1

2

3

4

5

firewall-cmd --add-masquerade --permanent

# 检查是否允许NAT转发

firewall-cmd --query-masquerade

# 关闭NAT转发

firewall-cmd --remove-masquerade

 如果你使用了istio还有把istio-pilot的端口加到防火墙里:

1

firewall-cmd --permanent --add-port=15010-15014/tcp

二、安装

2.1 安装docker

参考docker官网

2.2 部署kubernetes

1、更新yum源(各节点)

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

2、安装、开机自启kubelet(各节点)

yum -y install kubelet kubectl kubeadm
systemctl enable kubelet

3、配置Master节点初始化

kubeadm version #查看安装的版本
kubeadm init --kubernetes-version="v1.23.1" --pod-network-cidr=10.80.0.0/16 --image-repository registry.aliyuncs.com/google_containers
#初始化
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf

4、在master中安装flannel插入

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml如果wget下载有问题就用其他方法把yml文件下载下来
kubectl apply -f kube-flannel.yml

用kubectl查看状态是否变化为Ready。

kubectl get nodes

5、生成token

#如果过期可先执行此命令
kubeadm token create    #重新生成token
#列出token
kubeadm token list  | awk -F" " '{print $1}' |tail -n 1

6、获取CA公钥的哈希值

openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed  's/^ .* //'

7、加入node

kubeadm join k8s-master01:6443 --token qzj6hk.dolv4zlcscqkoc5e --discovery-token-ca-cert-hash sha256:fe8b1ce25d0e121bf874ebfb7353eb5fa8a5531d7aed7aa22b41ef9f5e051ca8

8、查看节点是否加入

kubectl get nodes

9、安装dashboard

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.2.0/aio/deploy/recommended.yaml

kubectl proxy --address=192.168.112.38 --disable-filter=true &

http://10.10.10.137:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/login

10、安装dashboard

wget https://kuboard.cn/install-script/kuboard.yaml

kubectl apply -f kuboard.yaml

kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep kuboard-user | awk '{print $1}') -o go-template='{{.data.token}}' | base64 -d

http://ip:32567/dashboard

FAQ

1、kubelet服务启动失败
注意kubelet的cgroup和docker都设置为systemd

journalctl -f -u kubelet 查看日志发现,报错如下:

kubelet cgroup driver: “cgroupfs” is different from docker cgroup driver: “systemd”

这个里要修改3个配置文件为systemd

1.vim /etc/docker/daemon.json
"exec-opts": ["native.cgroupdriver=systemd"]

2.vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
在KUBELET_KUBECONFIG_ARGS 后面追加 --cgroup-driver=systemd

Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --cgroup-driver=systemd"
3.vim /var/lib/kubelet/kubeadm-flags.env
KUBELET_KUBEADM_ARGS="--cgroup-driver=systemd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.2"
systemctl daemon-reload
systemctl restart kubelet

2、master节点可以当node使用

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

3、 外部访问dashboard

首先在跳板机上启动 kube-proxy (假设跳板机的 hostname 是 ttg11):

kubectl proxy --address='0.0.0.0' --accept-hosts='^\*$' &

然后本地 ssh 端口转发到跳板机:

ssh -L localhost:8001:localhost:8001 -NT weiping@ttg11

然后通过如下本地地址访问:

http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

4、pod在node上创建一直creating

network: failed to set bridge addr: "cni0" already has an IP address

rm -rf /var/lib/cni/
rm -rf /etc/cni/
ifconfig cni0 down
ip link delete cni0

5、 pod删除不掉

强制删除

kubectl delete pod -n go-test --force gotest-backend-deployment-6796ccf98c-f65bv 

6、Kubernetes对Pod调度指定Node以及Node的Taint 和 Toleration

Kubernetes对Pod调度指定Node以及Node的Taint 和 Toleration_Maxwell_Dncey的博客-CSDN博客_kubectl node taint1.指定pod到指定的node上#1.1查看节点的lebelkubectl get nodes --show-labels#1.2获取到该节点的label信息ip-10-100-2-80 Ready <none> 60d v1.14.2 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux...https://blog.csdn.net/weixin_42495873/article/details/103364868

7、k8s集群中node部署下载镜像失败

cp ~/.docker/config.json /var/lib/kubelet/config.json

Images | KubernetesA container image represents binary data that encapsulates an application and all its software dependencies. Container images are executable software bundles that can run standalone and that make very well defined assumptions about their runtime environment.You typically create a container image of your application and push it to a registry before referring to it in a PodThis page provides an outline of the container image concept.Image names Container images are usually given a name such as pause, example/mycontainer, or kube-apiserver.https://kubernetes.io/docs/concepts/containers/images/#configuring-nodes-to-authenticate-to-a-private-repository

8、node打标签做亲和性调度

kubectl label nodes <node-name> <label-key>=<label-value>  

9、namespace删不掉

 通过命令查看

kubectl edit namespace cert-manager

10、CRD启动失败,调用异常

E0323 07:50:56.028622       1 wrap.go:39] apiserver panic'd on GET /apis/apps.iluvatar.ai/v1/workflows?limit=500&resourceVersion=0
I0323 07:50:56.028691       1 log.go:172] http2: panic serving 10.10.10.137:44722: runtime error: invalid memory address or nil pointer dereference

kubernets版本16.0有问题,16.2+和15.5+修复,或删除[x-kubernetes-int-or-string] 

11、dns不通出现pod解析域名错误

dns.resolver.NoNameservers: All nameservers failed to answer the query service-registry.skydiscovery-system. IN A: Server 10.96.0.10 UDP port 53 answered SERVFAIL

flannel模块网络配置问题

kubeadm init --kubernetes-version="v1.15.5" --pod-network-cidr=192.168.0.0/16 --service-cidr=10.96.0.0/12 --image-repository registry.aliyuncs.com/google_containers

kube-flannel.yml

  net-conf.json: |
    {
      "Network": "192.168.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐