2020-08-19-k8sinstall

111 阅读4分钟

步骤

一、Docker安装;

二、k8s安装准备工作;

三、Master节点安装;

四、Node节点安装;

五、Dashboard安装;

六、集群测试。

环境说明:

172.27.9.131 master
172.27.9.135 node01
172.27.9.136 node02

一、Docker安装

所有节点都需要安装docker

  1. 安装依赖包
    yum install -y yum-utils device-mapper-persistent-data lvm2
  2. 设置Docker源
    yum-config-manager --add-repo download.docker.com/linux/cento…
  • 在使用yum命令安装指定版本docker时报如下错误:
    GPG key retrieval failed: [Errno 12] Timeout on download.docker.com/
    原因分析:这是由于国内访问不到docker官方镜像的缘故
    解决办法:
    yum-config-manager --add-repo mirrors.aliyun.com/docker-ce/l…
  1. 安装Docker CE
    3.1 docker安装版本查看
    yum list docker-ce --showduplicates | sort -r
    3.2 安装docker
    yum install docker-ce-18.09.6 docker-ce-cli-18.09.6 containerd.io
  • 不指定版本安装: yum install -y docker-ce docker-ce-cli containerd.io
  1. 启动Docker
    systemctl start docker
    systemctl enable docker
  2. 命令补全
    5.1 安装bash-completion
    yum -y install bash-completion
    5.2 加载bash-completion
    source /etc/profile.d/bash_completion.sh
  3. 镜像加速
    由于Docker Hub的服务器在国外,下载镜像会比较慢,可以配置镜像加速器。主要的加速器有:Docker官方提供的中国registry mirror、阿里云加速器、DaoCloud 加速器,本文以阿里加速器配置为例。
    6.1 登陆阿里云容器模块
    登陆地址为:cr.console.aliyun.com ,未注册的可以先注册阿里云账户
    6.2 配置镜像加速器
    配置daemon.json文件
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://tvgm2f32.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
  1. 验证
    docker --version
    docker run hello-world
    通过查询docker版本和运行容器hello-world来验证docker是否安装成功。

二、k8s安装准备工作 安装Centos是已经禁用了防火墙和selinux并设置了阿里源。master和node节点都执行本部分操作。
查看防火墙状态:firewall-cmd --state

  1. 配置主机名
    1.1 修改主机名
    hostnamectl set-hostname master
    more /etc/hostname
    退出重新登陆即可显示新设置的主机名master
    1.2 修改hosts文件
cat >> /etc/hosts << EOF
172.27.9.131    master
172.27.9.135    node01
172.27.9.136    node02
EOF

more /etc/hosts
2. 验证mac地址uuid
cat /sys/class/net/eth0/address cat /sys/class/dmi/id/product_uuid
保证各节点mac和uuid唯一
3. 禁用swap
3.1 临时禁用
swapoff -a
3.2 永久禁用
若需要重启后也生效,在禁用swap后还需修改配置文件/etc/fstab,注释swap
sed -i.bak '/swap/s/^/#/' /etc/fstab
4. 内核参数修改
4.1 临时修改
sysctl net.bridge.bridge-nf-call-iptables=1
sysctl net.bridge.bridge-nf-call-ip6tables=1
4.2 永久修改

cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl -p /etc/sysctl.d/k8s.conf
5. 修改Cgroup Driver
5.1 修改daemon.json
修改daemon.json,新增‘"exec-opts": ["native.cgroupdriver=systemd"]’
more /etc/docker/daemon.json
{ "registry-mirrors": ["v16stybc.mirror.aliyuncs.com"], "exec-opts": ["native.cgroupdriver=systemd"] }
5.2 重新加载docker
systemctl daemon-reload
systemctl restart docker
6. 设置kubernetes源
6.1 新增kubernetes源

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[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
  • [] 中括号中的是repository id,唯一,用来标识不同仓库
  • name 仓库名称,自定义
  • baseurl 仓库地址
  • enable 是否启用该仓库,默认为1表示启用
  • gpgcheck 是否验证从该仓库获得程序包的合法性,1为验证
  • repo_gpgcheck 是否验证元数据的合法性 元数据就是程序包列表,1为验证
  • gpgkey=URL 数字签名的公钥文件所在位置,如果gpgcheck值为1,此处就需要指定gpgkey文件的位置,如果gpgcheck值为0就不需要此项了
    6.2 更新缓存
    yum clean all
    yum -y makecache
    三、Master节点安装
  1. 版本查看
    yum list kubelet --showduplicates | sort -r
  2. 安装kubelet、kubeadm和kubectl
    2.1 安装三个包
    yum install -y kubelet-1.18.2 kubeadm-1.18.2 kubectl-1.18.2
    若不指定版本直接运行‘yum install -y kubelet kubeadm kubectl’则默认安装最新版
    2.2 安装包说明
    kubelet 运行在集群所有节点上,用于启动Pod和容器等对象的工具
    kubeadm 用于初始化集群,启动集群的命令工具
    kubectl 用于和集群通信的命令行,通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
    2.3 启动kubelet
    启动kubelet并设置开机启动
    systemctl enable kubelet && systemctl start kubelet
    2.4 kubelet命令补全
    echo "source <(kubectl completion bash)" >> ~/.bash_profile
    source .bash_profile
  3. 下载镜像
    3.1 镜像下载的脚本
    Kubernetes几乎所有的安装组件和Docker镜像都放在goolge自己的网站上,直接访问可能会有网络问题,这里的解决办法是从阿里云镜像仓库下载镜像,拉取到本地以后改回默认的镜像tag。
more image.sh 
#!/bin/bash
url=registry.cn-hangzhou.aliyuncs.com/google_containers
version=v1.18.2
images=(`kubeadm config images list --kubernetes-version=$version|awk -F '/' '{print $2}'`)
for imagename in ${images[@]} ; do
  docker pull $url/$imagename
  docker tag $url/$imagename k8s.gcr.io/$imagename
  docker rmi -f $url/$imagename
done

url为阿里云镜像仓库地址,version为安装的kubernetes版本。
3.2 下载镜像
运行脚本image.sh,下载指定版本的镜像
./image.sh
docker images
4. 初始化Master
4.1 初始化

kubeadm init \
--apiserver-advertise-address=172.27.9.131 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.18.2 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16  

apiserver-advertise-address指定master的interface,pod-network-cidr指定Pod网络的范围,这里使用flannel网络方案。
记录kubeadm join的输出,后面需要这个命令将各个节点加入集群中。
4.2 加载环境变量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source .bash_profile
本文所有操作都在root用户下执行,若为非root用户,则执行如下操作:
mkdir -p HOME/.kubecpi/etc/kubernetes/admin.confHOME/.kube cp -i /etc/kubernetes/admin.conf HOME/.kube/config
chown (idu):(id -u):(id -g) $HOME/.kube/config
5. 安装pod网络
kubectl apply -f raw.githubusercontent.com/coreos/flan…
6. master节点配置
taint:污点的意思。如果一个节点被打上了污点,那么pod是不允许运行在这个节点上面的
6.1 删除master节点默认污点
默认情况下集群不会在master上调度pod,如果偏想在master上调度Pod,可以执行如下操作:
查看污点:
kubectl describe node master|grep -i taints
Taints: node-role.kubernetes.io/master:NoSchedule
删除默认污点:kubectl taint nodes master node-role.kubernetes.io/master-node/master untainted
6.2 污点机制

语法:

kubectl taint node [node] key=value[effect]
其中[effect] 可取值: [ NoSchedule | PreferNoSchedule | NoExecute ] NoSchedule: 一定不能被调度 PreferNoSchedule: 尽量不要调度 NoExecute: 不仅不会调度, 还会驱逐Node上已有的Pod 打污点

[root@master ~]# kubectl taint node master key1=value1:NoSchedule node/master tainted [root@master ~]# kubectl describe node master|grep -i taints Taints: key1=value1:NoSchedule key为key1,value为value1(value可以为空),effect为NoSchedule表示一定不能被调度

删除污点:

[root@master ~]# kubectl taint nodes master key1-
node/master untainted [root@master ~]# kubectl describe node master|grep -i taints Taints: 删除指定key所有的effect,‘-’表示移除所有以key1为键的污点

四、Node节点安装

  1. 安装kubelet、kubeadm和kubectl
    同master节点
  2. 下载镜像
    同master节点
  3. 加入集群
    以下操作master上执行
    3.1 查看令牌
    kubeadm token list
    3.2 生成新的令牌
    kubeadm token create
    3.3 生成新的加密串 openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null |
    openssl dgst -sha256 -hex | sed 's/^.* //'
    3.4 node节点加入集群
    在node节点上分别执行如下操作(步骤4.1中记录kubeadm join的输出):
    kubeadm join 172.27.9.131:6443 --token 1zl3he.fxgz2pvxa3qkwxln --discovery-token-ca-cert-hash sha256:5f656ae26b5e7d4641a979cbfdffeb7845cc5962bbfcd1d5435f00a25c02ea50

五、Dashboard安装

  1. 下载yaml文件手动修改service部分
    wget raw.githubusercontent.com/kubernetes/…
  2. 修改yaml文件
    2.1 vim recommended.yaml
    2.2 修改Service部分

-----------------------------------------------
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  type: NodePort
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30443
  selector:
    k8s-app: kubernetes-dashboard
 ----------------------------------------------

注意如果这里的nodePort写成nodeport或者存在其他书写问题,就会报错 不能用tab缩进,冒号后有空格
3. 更新配置
kubectl apply -f recommended.yaml
状态查看 kubectl get deployment kubernetes-dashboard -n kube-system
kubectl get pods -n kube-system -o wide
kubectl get services -n kube-system
4. 登录dashboard
浏览器访问dashboard:
https://<any_node_ip>:30443
5. Token认证方式登录 5.1 创建dashboard-adminuser.yaml:

cat > dashboard-adminuser.yaml << EOF
 apiVersion: v1
 kind: ServiceAccount
 metadata:
   name: admin-user
   namespace: kubernetes-dashboard
 
 ---
 apiVersion: rbac.authorization.k8s.io/v1
 kind: ClusterRoleBinding
 metadata:
   name: admin-user
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: ClusterRole
   name: cluster-admin
 subjects:
 - kind: ServiceAccount
   name: admin-user
   namespace: kubernetes-dashboard
EOF

5.2 创建登录用户
kubectl apply -f dashboard-adminuser.yaml

  • 说明:上面创建了一个叫admin-user的服务账号,并放在kubernetes-dashboard命名空间下,并将cluster-admin角色绑定到admin-user账户,这样admin-user账户就有了管理员的权限。默认情况下,kubeadm创建集群时已经创建了cluster-admin角色,我们直接绑定即可。
    5.3 查看admin-user账户的token
    kubectl -n kubernetes-dashboard describe secret (kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print 1}')
    把获取到的Token复制到登录界面的Token输入框中,登陆成功。

六、集群测试

问题汇总

kubeadm安装k8s 组件controller-manager 和scheduler状态 Unhealthy

通过kubeadm安装好kubernetes v1.18.6 查看集群状态,发现组件controller-manager 和scheduler状态 Unhealthy
检查端口未监听
组件运行正常
检查kube-scheduler和kube-controller-manager组件配置是否禁用了非安全端口
vim /etc/kubernetes/manifests/kube-scheduler.yaml
vim /etc/kubernetes/manifests/kube-controller-manager.yaml
将port=0去掉
然后systemctl restart kubelet
再检查集群组件状态已正常
转载地址:www.gjie.cn/2618.html