kubernetes(一)--使用kubeadm安裝k8s


一、系統初始化

1)環境准備

節點 ip
master01 10.0.0.11
node01 10.0.0.20
node02 10.0.0.21
harbor 10.0.0.12

2)設置系統主機名及hosts解析

#修改主機名
[root@k8s-master ~]# hostnamectl set-hostname k8s-master01

#配置hosts解析
[root@k8s-master01 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.11 k8s-master01
10.0.0.20 k8s-node01
10.0.0.21 k8s-node02
10.0.0.12 harbor

#拷貝hosts文件置其他服務器
[root@k8s-master01 ~]# scp /etc/hosts root@10.0.0.20:/etc/hosts
[root@k8s-master01 ~]# scp /etc/hosts root@10.0.0.21:/etc/hosts
[root@k8s-master01 ~]# scp /etc/hosts root@10.0.0.12:/etc/hosts

3)安裝相關依賴包

[root@k8s-master01 ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@k8s-master01 ~]# yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git

4)設置防火牆為iptables並設置空規則

[root@k8s-master01 ~]# systemctl stop firewalld && systemctl disable firewalld
[root@k8s-master01 ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)
[root@k8s-master01 ~]# yum install -y iptables-services && systemctl start iptables && systemctl enable iptables &&iptables -F && service iptables save

5)關閉swap及selinux

K8s初始化init時,會檢測swap分區有沒有關閉,如果虛擬內存開啟,容器pod就可能會放置在虛擬內存中運行,會大大降低運行效率

#關閉swap,
[root@k8s-master01 ~]# swapoff -a && sed -r -i '/swap/s@(.*)@#\1@g' /etc/fstab

#關閉selinux
[root@k8s-master01 ~]# setenforce 0 && sed -i 's#^SELINUX=.*#SELINUX=disabled#g' /etc/selinux/config
setenforce: SELinux is disabled
[root@k8s-master01 ~]# getenforce
Disabled

6)升級內核為4.4

#安裝完成后檢查 /boot/grub2/grub.cfg 中對應內核 menuentry 中是否包含 initrd16 配置,如果沒有,再安裝一次!
[root@k8s-master01 ~]# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
[root@k8s-master01 ~]# yum --enablerepo=elrepo-kernel install -y kernel-lt

#設置開機從新內核啟動
[root@k8s-master01 ~]# grub2-set-default "CentOS Linux (4.4.182-1.el7.elrepo.x86_64) 7 (Core)"

#重啟
[root@k8s-master01 ~]# reboot
[root@k8s-master01 ~]# uname -r
4.4.212-1.el7.elrepo.x86_64

7)調整內核參數

cat > /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0 # 禁止使用 swap 空間,只有當系統 OOM 時才允許使用它
vm.overcommit_memory=1 # 不檢查物理內存是否夠用
vm.panic_on_oom=0 # 開啟OOM
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF

#使配置生效
[root@k8s-master01 ~]# sysctl -p /etc/sysctl.d/kubernetes.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
net.ipv4.tcp_tw_recycle = 0
vm.swappiness = 0 # 禁止使用 swap 空間,只有當系統 OOM 時才允許使用它
vm.overcommit_memory = 1 # 不檢查物理內存是否夠用
vm.panic_on_oom = 0 # 開啟OOM
fs.inotify.max_user_instances = 8192
fs.inotify.max_user_watches = 1048576
fs.file-max = 52706963
fs.nr_open = 52706963
net.ipv6.conf.all.disable_ipv6 = 1
sysctl: cannot stat /proc/sys/net/netfilter/nf_conntrack_max: No such file or directory

8)調整系統時區

#設置系統時區為中國/上海
[root@k8s-master01 ~]# timedatectl set-timezone Asia/Shanghai
#將當前的 UTC 時間寫入硬件時鍾
[root@k8s-master01 ~]# timedatectl set-local-rtc 0
#重啟依賴於系統時間的服務
[root@k8s-master01 ~]# systemctl restart rsyslog && systemctl restart crond

9)關閉不需要的服務

[root@k8s-master01 ~]# systemctl stop postfix && systemctl disable postfix

10)設置 rsyslogd 和 systemd journald

centos7以后,引導方式改為了systemd,所以會有兩個日志系統同時工作只保留一個日志(journald)的方法

#持久化保存日志的目錄
[root@k8s-master01 ~]# mkdir /var/log/journal
[root@k8s-master01 ~]# mkdir /etc/systemd/journald.conf.d

#配置文件
cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
[Journal]
#持久化保存到磁盤
Storage=persistent
# 壓縮歷史日志
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
# 最大占用空間10G
SystemMaxUse=10G
# 單日志文件最大200M
SystemMaxFileSize=200M
# 日志保存時間 2 周
MaxRetentionSec=2week
# 不將日志轉發到 syslog
ForwardToSyslog=no
EOF

#重啟journald配置
[root@k8s-master01 ~]# systemctl restart systemd-journald

二、kube-proxy開啟ipvs的前置

#加載netfilter模塊
[root@k8s-master01 ~]# modprobe br_netfilter

#添加配置文件
cat  >  /etc/sysconfig/modules/ipvs.modules  <<EOF
#!/bin/bash
modprobe  --  ip_vs
modprobe  --  ip_vs_rr
modprobe  --  ip_vs_wrr
modprobe  --  ip_vs_sh
modprobe  --  nf_conntrack_ipv4
EOF

#賦予權限並引導
[root@k8s-master01 ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules &&lsmod | grep -e ip_vs -e nf_conntrack_ipv4
nf_conntrack_ipv4      20480  0 
nf_defrag_ipv4         16384  1 nf_conntrack_ipv4
ip_vs_sh               16384  0 
ip_vs_wrr              16384  0 
ip_vs_rr               16384  0 
ip_vs                 147456  6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack          114688  2 ip_vs,nf_conntrack_ipv4
libcrc32c              16384  2 xfs,ip_vs

三、docker安裝

#docker依賴
[root@k8s-master01 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

#導入阿里雲的docker-ce倉庫
[root@k8s-master01 ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

#更新系統安裝docker-ce
[root@k8s-master01 ~]# yum update -y && yum install -y docker-ce

#配置文件
[root@k8s-master01 ~]# mkdir /etc/docker -p
[root@k8s-master01 ~]# mkdir -p  /etc/systemd/system/docker.service.d

cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
	"max-size": "100m"
	}
}
EOF

#啟動docker
[root@k8s-master01 ~]# systemctl daemon-reload && systemctl start docker && systemctl enable docker

四、kubeadm安裝

#導入阿里雲的YUM倉庫
cat  <<EOF >  /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

#在每個節點安裝kubeadm(初始化工具)、kubectl(命令行管理工具)、kubelet(與docker的cri交互創建容器)
[root@k8s-master01 ~]# yum -y install kubeadm-1.15.1 kubectl-1.15.1 kubelet-1.15.1

#開機自啟,暫先不啟動
[root@k8s-master01 ~]# systemctl enable kubelet.service

五、主節點(master)初始化

鏈接:https://pan.baidu.com/s/1bTSYZ0tflYbJ8DQKgbfq0w 
提取碼:7kry
------------------------------------------------------

[root@k8s-master01 ~]# cd k8s/
[root@k8s-master01 k8s]# ls
kubeadm-basic.images.tar.gz
[root@k8s-master01 k8s]# tar xf kubeadm-basic.images.tar.gz 
[root@k8s-master01 k8s]# ls
kubeadm-basic.images  kubeadm-basic.images.tar.gz

#創建導入鏡像腳本
[root@k8s-master01 k8s]# cat load-images.sh
#!/bin/bash
ls /root/k8s/kubeadm-basic.images > /tmp/images-list.txt
cd /root/k8s/kubeadm-basic.images
for i in `cat /tmp/images-list.txt`
do
    docker load -i $i
done
rm -f /tmp/images-list.txt

#授權並執行腳本
[root@k8s-master01 k8s]# chmod +x load-images.sh
[root@k8s-master01 k8s]# ./load-images.sh

#查看
[root@k8s-master01 k8s]# docker images
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
k8s.gcr.io/kube-controller-manager   v1.15.1             d75082f1d121        6 months ago        159MB
k8s.gcr.io/kube-proxy                v1.15.1             89a062da739d        6 months ago        82.4MB
k8s.gcr.io/kube-scheduler            v1.15.1             b0b3c4c404da        6 months ago        81.1MB
k8s.gcr.io/kube-apiserver            v1.15.1             68c3eb07bfc3        6 months ago        207MB
k8s.gcr.io/coredns                   1.3.1               eb516548c180        12 months ago       40.3MB
k8s.gcr.io/etcd                      3.3.10              2c4adeb21b4f        14 months ago       258MB
k8s.gcr.io/pause                     3.1                 da86e6ba6ca1        2 years ago         742kB

#初始化節點
[root@k8s-master01 k8s]# kubeadm config print init-defaults > kubeadm-config.yaml
[root@k8s-master01 k8s]# vim kubeadm-config.yaml
[root@k8s-master01 k8s]# cat kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 10.0.0.11
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: k8s-master01
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.15.1
networking:
  dnsDomain: cluster.local
  podSubnet: "10.244.0.0/16"
  serviceSubnet: 10.96.0.0/12
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
featureGates:
  SupportIPVSProxyMode: true
mode: ipvs

image

#指定配置文件進行初始化
[root@k8s-master01 k8s]# kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs | tee kubeadm-init.log
Flag --experimental-upload-certs has been deprecated, use --upload-certs instead
[init] Using Kubernetes version: v1.15.1
[preflight] Running pre-flight checks
	[WARNING SystemVerification]: this Docker version is not on the list of validated versions: 19.03.5. Latest validated version: 18.09
error execution phase preflight: [preflight] Some fatal errors occurred:
	[ERROR NumCPU]: the number of available CPUs 1 is less than the required 2
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
[root@k8s-master01 k8s]# kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs | tee kubeadm-init.log
Flag --experimental-upload-certs has been deprecated, use --upload-certs instead
[init] Using Kubernetes version: v1.15.1
[preflight] Running pre-flight checks
	[WARNING SystemVerification]: this Docker version is not on the list of validated versions: 19.03.5. Latest validated version: 18.09
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Activating the kubelet service
[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Generating "ca" certificate and key
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [k8s-master01 kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 10.0.0.11]
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Generating "etcd/ca" certificate and key
[certs] Generating "apiserver-etcd-client" certificate and key
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names [k8s-master01 localhost] and IPs [10.0.0.11 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [k8s-master01 localhost] and IPs [10.0.0.11 127.0.0.1 ::1]
[certs] Generating "etcd/healthcheck-client" certificate and key
[certs] Generating "sa" key and public key
[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
[control-plane] Using manifest folder "/etc/kubernetes/manifests"
[control-plane] Creating static Pod manifest for "kube-apiserver"
[control-plane] Creating static Pod manifest for "kube-controller-manager"
[control-plane] Creating static Pod manifest for "kube-scheduler"
[etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
[apiclient] All control plane components are healthy after 22.502653 seconds
[upload-config] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[kubelet] Creating a ConfigMap "kubelet-config-1.15" in namespace kube-system with the configuration for the kubelets in the cluster
[upload-certs] Storing the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace
[upload-certs] Using certificate key:
58b7cf30f439297cf587447e6c41a5783c967365ec11df8e975d7117ed8c81a6
[mark-control-plane] Marking the node k8s-master01 as control-plane by adding the label "node-role.kubernetes.io/master=''"
[mark-control-plane] Marking the node k8s-master01 as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule]
[bootstrap-token] Using token: abcdef.0123456789abcdef
[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles
[bootstrap-token] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstrap-token] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstrap-token] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstrap-token] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy

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

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/

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

kubeadm join 10.0.0.11:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:11fe8136105caff3d0029fee0111e05aee5ac34d0322828fd634c2a104475d6e 
[root@k8s-master01 k8s]# 

#master上執行
[root@k8s-master01 k8s]# mkdir -p $HOME/.kube
[root@k8s-master01 k8s]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master01 k8s]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

#查看node狀態
[root@k8s-master01 k8s]# kubectl get node
NAME           STATUS     ROLES    AGE   VERSION
k8s-master01   NotReady   master   7m    v1.15.1   #因為還沒有構建flannel網絡,所以還是NotReady

六、flannel插件安裝

master節點安裝flannel:

[root@k8s-master01 k8s]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
[root@k8s-master01 k8s]# kubectl create -f kube-flannel.yml
[root@k8s-master01 k8s]# kubectl get pod -n kube-system
NAME                                   READY   STATUS    RESTARTS   AGE
coredns-5c98db65d4-6vgp6               1/1     Running   0          35m
coredns-5c98db65d4-8zbqt               1/1     Running   0          35m
etcd-k8s-master01                      1/1     Running   1          34m
kube-apiserver-k8s-master01            1/1     Running   1          35m
kube-controller-manager-k8s-master01   1/1     Running   1          35m
kube-flannel-ds-amd64-z76v7            1/1     Running   0          3m12s  #flannel容器
kube-proxy-qd4xm                       1/1     Running   1          35m
kube-scheduler-k8s-master01            1/1     Running   1          34m
[root@k8s-master01 k8s]# kubectl get node
NAME           STATUS   ROLES    AGE   VERSION
k8s-master01   Ready    master   37m   v1.15.1  #master已就緒

七、節點加入集群

#將相關鏡像拷貝到節點中
[root@k8s-master01 k8s]# scp -rp kubeadm-basic.images.tar.gz load-images.sh root@10.0.0.20:~/k8s
[root@k8s-master01 k8s]# scp -rp kubeadm-basic.images.tar.gz load-images.sh root@10.0.0.21:~/k8s

#導入鏡像
[root@k8s-node01 k8s]# ./load-images.sh

#節點加入集群
[root@k8s-node01 ~]# kubeadm join 10.0.0.11:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:11fe8136105caff3d0029fee0111e05aee5ac34d0322828fd634c2a104475d6e
[preflight] Running pre-flight checks
	[WARNING SystemVerification]: this Docker version is not on the list of validated versions: 19.03.5. Latest validated version: 18.09
	[WARNING Service-Kubelet]: kubelet service is not enabled, please run 'systemctl enable kubelet.service'
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -oyaml'
[kubelet-start] Downloading configuration for the kubelet from the "kubelet-config-1.15" ConfigMap in the kube-system namespace
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Activating the kubelet service
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

#同理,node02執行相同命令

--------------------------------------------------------------------------------------------------
#master節點查看狀態
[root@k8s-master01 k8s]# kubectl get node
NAME           STATUS   ROLES    AGE   VERSION
k8s-master01   Ready    master   65m   v1.15.1
k8s-node01     Ready    <none>   21m   v1.15.1
k8s-node02     Ready    <none>   20m   v1.15.1
[root@k8s-master01 k8s]# kubectl get pod -n kube-system
NAME                                   READY   STATUS    RESTARTS   AGE
coredns-5c98db65d4-6vgp6               1/1     Running   0          65m
coredns-5c98db65d4-8zbqt               1/1     Running   0          65m
etcd-k8s-master01                      1/1     Running   1          64m
kube-apiserver-k8s-master01            1/1     Running   1          64m
kube-controller-manager-k8s-master01   1/1     Running   1          64m
kube-flannel-ds-amd64-m769r            1/1     Running   0          21m
kube-flannel-ds-amd64-sjwph            1/1     Running   0          20m
kube-flannel-ds-amd64-z76v7            1/1     Running   0          32m
kube-proxy-4g57j                       1/1     Running   0          21m
kube-proxy-qd4xm                       1/1     Running   1          65m
kube-proxy-x66cd                       1/1     Running   0          20m
kube-scheduler-k8s-master01            1/1     Running   1          64m

八、安裝harbor

1)安裝docker

[root@harbor ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@harbor ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@harbor ~]# yum update -y && yum install -y docker-ce
[root@harbor ~]# mkdir /etc/docker -p
[root@harbor ~]# mkdir -p  /etc/systemd/system/docker.service.d

cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
	"max-size": "100m"
	},
"insecure-registries": ["https://hub.dianchou.com"]
}
EOF

[root@harbor ~]# systemctl start docker && systemctl enable docker

#注意: 其他節點也需要配置/etc/docker/daemon.json,並重啟docker

2)使用docker-compose安裝harbor

#上傳docker-compose及harbor離線安裝包
[root@harbor ~]# ls
anaconda-ks.cfg  docker-compose  harbor-offline-installer-v1.2.0.tgz
[root@harbor ~]# mv docker-compose /usr/local/bin
[root@harbor ~]# chmod +x /usr/local/bin/docker-compose 
[root@harbor ~]# tar xf harbor-offline-installer-v1.2.0.tgz -C /usr/local/
[root@harbor ~]# cd /usr/local/harbor/
[root@harbor harbor]# ls
common                    docker-compose.notary.yml  harbor_1_1_0_template  harbor.v1.2.0.tar.gz  LICENSE  prepare
docker-compose.clair.yml  docker-compose.yml         harbor.cfg             install.sh            NOTICE   upgrade
[root@harbor harbor]# ll
total 485012
drwxr-xr-x 3 root root        23 Feb  2 16:42 common
-rw-r--r-- 1 root root      1163 Sep 11  2017 docker-compose.clair.yml
-rw-r--r-- 1 root root      1988 Sep 11  2017 docker-compose.notary.yml
-rw-r--r-- 1 root root      3191 Sep 11  2017 docker-compose.yml
-rw-r--r-- 1 root root      4304 Sep 11  2017 harbor_1_1_0_template
-rw-r--r-- 1 root root      4345 Sep 11  2017 harbor.cfg
-rw-r--r-- 1 root root 496209164 Sep 11  2017 harbor.v1.2.0.tar.gz
-rwxr-xr-x 1 root root      5332 Sep 11  2017 install.sh
-rw-r--r-- 1 root root    371640 Sep 11  2017 LICENSE
-rw-r--r-- 1 root root       482 Sep 11  2017 NOTICE
-rwxr-xr-x 1 root root     17592 Sep 11  2017 prepare
-rwxr-xr-x 1 root root      4550 Sep 11  2017 upgrade

#編輯harbor配置文件
[root@harbor harbor]# vim harbor.cfg 
hostname = hub.dianchou.com
ui_url_protocol = https

#The password for the root user of mysql db, change this before any production use.
db_password = root123

#Maximum number of job workers in job service  
max_job_workers = 3 

#Determine whether or not to generate certificate for the registry's token.
#If the value is on, the prepare script creates new root cert and private key 
#for generating token to access the registry. If the value is off the default key/cert will be used.
#This flag also controls the creation of the notary signer's cert.
customize_crt = on

#The path of cert and key files for nginx, they are applied only the protocol is set to https
ssl_cert = /data/cert/server.crt
ssl_cert_key = /data/cert/server.key
....

#創建證書
[root@harbor harbor]# mkdir -p /data/cert
[root@harbor harbor]# cd /data/cert
[root@harbor cert]# openssl genrsa -des3 -out server.key 2048
Generating RSA private key, 2048 bit long modulus
.........................................................+++
.....+++
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:
[root@harbor cert]# openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:BJ
Locality Name (eg, city) [Default City]:BJ
Organization Name (eg, company) [Default Company Ltd]:dianchou
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:hub.dianchou.com
Email Address []:352972405@qq.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456
An optional company name []:123456
[root@harbor cert]# cp server.key server.key.org
[root@harbor cert]# openssl rsa -in server.key.org -out server.key
Enter pass phrase for server.key.org:
writing RSA key
[root@harbor cert]# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Signature ok
subject=/C=CN/ST=BJ/L=BJ/O=dianchou/CN=hub.dianchou.com/emailAddress=352972405@qq.com
Getting Private key
[root@harbor cert]# chmod -R 777 /data/cert
[root@harbor cert]# ls
server.crt  server.csr  server.key  server.key.org

#運行腳本安裝
[root@harbor data]# cd /usr/local/harbor/
[root@harbor harbor]# ./install.sh
...
✔ ----Harbor has been installed and started successfully.----

Now you should be able to visit the admin portal at https://hub.dianchou.com. 
For more details, please visit https://github.com/vmware/harbor .

修改windows的hosts解析:10.0.0.12  hub.dianchou.com

訪問測試:https://hub.dianchou.com/     admin  Harbor12345

image

3)客戶端測試

#節點添加解析
[root@k8s-node01 ~]# echo "10.0.0.12 hub.dianchou.com" >> /etc/hosts
[root@k8s-node01 ~]# docker login https://hub.dianchou.com
Username: admin
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

#推送鏡像測試
[root@k8s-node01 ~]# docker pull wangyanglinux/myapp:v1
[root@k8s-node01 ~]# docker tag wangyanglinux/myapp:v1 hub.dianchou.com/library/myapp:v1
[root@k8s-node01 ~]# docker push hub.dianchou.com/library/myapp:v1

瀏覽器查看鏡像:

image

九、k8s測試

[root@k8s-master01 ~]# kubectl run nginx-deployment --image=hub.dianchou.com/library/myapp:v1 --port=80 --replicas=1
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/nginx-deployment created
[root@k8s-master01 ~]# kubectl get deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   1/1     1            1           25s
[root@k8s-master01 ~]# kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-6596568468   1         1         1       74s
[root@k8s-master01 ~]# kubectl get pod
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-6596568468-xjg8w   1/1     Running   0          94s
[root@k8s-master01 ~]# kubectl get pod -o wide
NAME                                READY   STATUS    RESTARTS   AGE    IP           NODE         NOMINATED NODE   READINESS GATES
nginx-deployment-6596568468-xjg8w   1/1     Running   0          100s   10.244.2.2   k8s-node02   <none>           <none>

#node02上查看
[root@k8s-node02 ~]# docker ps -a|grep nginx
2ea7e8d31311        hub.dianchou.com/library/myapp   "nginx -g 'daemon of…"   4 minutes ago       Up 4 minutes                                 k8s_nginx-deployment_nginx-deployment-6596568468-xjg8w_default_5f34696d-f9c4-467b-b5b5-a98878b1297e_0
c48f1decaa76        k8s.gcr.io/pause:3.1             "/pause"                 4 minutes ago       Up 4 minutes                                 k8s_POD_nginx-deployment-6596568468-xjg8w_default_5f34696d-f9c4-467b-b5b5-a98878b1297e_0

#訪問測試
[root@k8s-master01 ~]# curl 10.244.2.2
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@k8s-master01 ~]# curl 10.244.2.2/hostname.html
nginx-deployment-6596568468-xjg8w

#刪除pod,會重新生成新的pod
[root@k8s-master01 ~]# kubectl get pod
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-6596568468-xjg8w   1/1     Running   0          7m49s
[root@k8s-master01 ~]# kubectl delete pod nginx-deployment-6596568468-xjg8w
pod "nginx-deployment-6596568468-xjg8w" deleted
[root@k8s-master01 ~]# kubectl get pod
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-6596568468-lgk9r   1/1     Running   0          27s

#pod擴容
[root@k8s-master01 ~]# kubectl scale --replicas=3 deployment/nginx-deployment
deployment.extensions/nginx-deployment scaled
[root@k8s-master01 ~]# kubectl get pod
NAME                                READY   STATUS              RESTARTS   AGE
nginx-deployment-6596568468-kbz7g   0/1     ContainerCreating   0          3s
nginx-deployment-6596568468-lbtsb   0/1     ContainerCreating   0          3s
nginx-deployment-6596568468-lgk9r   1/1     Running             0          83s
[root@k8s-master01 ~]# kubectl get pod
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-6596568468-kbz7g   1/1     Running   0          6s
nginx-deployment-6596568468-lbtsb   1/1     Running   0          6s
nginx-deployment-6596568468-lgk9r   1/1     Running   0          86s
[root@k8s-master01 ~]# kubectl get pod -o wide
NAME                                READY   STATUS    RESTARTS   AGE    IP           NODE         NOMINATED NODE   READINESS GATES
nginx-deployment-6596568468-kbz7g   1/1     Running   0          27s    10.244.2.4   k8s-node02   <none>           <none>
nginx-deployment-6596568468-lbtsb   1/1     Running   0          27s    10.244.2.3   k8s-node02   <none>           <none>
nginx-deployment-6596568468-lgk9r   1/1     Running   0          107s   10.244.1.2   k8s-node01   <none>           <none>

暴露 端口供外界訪問:

[root@k8s-master01 ~]# kubectl expose --help
[root@k8s-master01 ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   3h14m
[root@k8s-master01 ~]# kubectl get deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           15m
[root@k8s-master01 ~]# kubectl expose deployment nginx-deployment --port=30000 --target-port=80
service/nginx-deployment exposed
[root@k8s-master01 ~]# kubectl get svc
NAME               TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)     AGE
kubernetes         ClusterIP   10.96.0.1     <none>        443/TCP     3h15m
nginx-deployment   ClusterIP   10.98.45.91   <none>        30000/TCP   28s
[root@k8s-master01 ~]# curl 10.98.45.91
curl: (7) Failed connect to 10.98.45.91:80; Connection refused
[root@k8s-master01 ~]# curl 10.98.45.91:30000
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
#輪詢機制
[root@k8s-master01 ~]# curl 10.98.45.91:30000/hostname.html
nginx-deployment-6596568468-lbtsb
[root@k8s-master01 ~]# curl 10.98.45.91:30000/hostname.html
nginx-deployment-6596568468-lgk9r
[root@k8s-master01 ~]# curl 10.98.45.91:30000/hostname.html
nginx-deployment-6596568468-kbz7g

#查看lvs規則
[root@k8s-master01 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.96.0.1:443 rr
  -> 10.0.0.11:6443               Masq    1      3          0         
TCP  10.96.0.10:53 rr
  -> 10.244.0.6:53                Masq    1      0          0         
  -> 10.244.0.7:53                Masq    1      0          0         
TCP  10.96.0.10:9153 rr
  -> 10.244.0.6:9153              Masq    1      0          0         
  -> 10.244.0.7:9153              Masq    1      0          0         
TCP  10.98.45.91:30000 rr  #輪詢機制
  -> 10.244.1.2:80                Masq    1      0          0         
  -> 10.244.2.3:80                Masq    1      0          0         
  -> 10.244.2.4:80                Masq    1      0          0         
UDP  10.96.0.10:53 rr
  -> 10.244.0.6:53                Masq    1      0          0         
  -> 10.244.0.7:53                Masq    1      0          0

#此時無法通過外部瀏覽直接訪問-->修改type類型為:type: ClusterIP ==> type: NodePort
[root@k8s-master01 ~]# kubectl get svc
NAME               TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)     AGE
kubernetes         ClusterIP   10.96.0.1     <none>        443/TCP     3h22m
nginx-deployment   ClusterIP   10.98.45.91   <none>        30000/TCP   6m41s
[root@k8s-master01 ~]# kubectl edit svc nginx-deployment
service/nginx-deployment edited
[root@k8s-master01 ~]# kubectl get svc
NAME               TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)           AGE
kubernetes         ClusterIP   10.96.0.1     <none>        443/TCP           3h25m
nginx-deployment   NodePort    10.98.45.91   <none>        30000:31156/TCP   9m38s  #注意:所有節點暴露31156端口訪問

imageimage

imageimage


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM