본관은 광산(光山). 자는 위경(撝卿). 김약채(金若采)의 증손으로, 할아버지는 예문관검열(藝文館檢閱) 김문(金問)이고, 아버지는 증 영의정 김철산(金鐵山)이며, 어머니는 대도호부사 김명리(金明理)의 딸이다.
1453년(단종 1) 식년 문과에 정과로 급제, 예문관검열이 되고, 그 뒤 감찰·정언·병조좌랑·병조정랑을 거쳐 1460년(세조 6) 장령에 승진되었다. 같은 해 신숙주(申叔舟)의 종사관이 되어 건주위(建州衛)의 야인을 정벌하는 데 공을 세우고 군기감정에 올랐으며, 이듬해 지병조사(知兵曹事)에 이어 동부승지·좌부승지·우승지·평안도관찰사 등을 차례로 역임하였다.
1465년 호조참판을 거쳐 이듬해 개성부유수로 있을 때, 궐원이 된 평안도절도사의 적임자로 천거를 받아 승진, 임명되었다. 1467년 예조판서에 승직되었고, 이듬해 경상도관찰사로 나갔으며, 1469년(예종 1)에 예조판서에 재임되었다. 1471년에는 좌리공신(佐理功臣) 3등으로 광성군(光城君)에 봉해지고, 1475년 정조사(正朝使)로 명나라에 다녀왔다.
1482년에는 황해도 지방의 기근을 구제하기 위해 황해도진휼사로 나갔다. 이듬해 우참찬이 되어 세조비인 정희왕후(貞熹王后)의 상례를 주관했으며, 창경궁과 세자궁의 중수를 책임 맡아 처리하였다. 1485년 좌참찬을 거쳐 1486년 세자좌빈객이 되었다. 세조의 신임을 받아 건주위 야인 토벌을 비롯해 평안도관찰사와 절도사를 지내면서 세조의 국방 정책에 기여한 공이 컸다. 시호는 공안(恭安)이다.